C# 异步读写文本行

C# 异步读写文本行,c#,asynchronous,text,C#,Asynchronous,Text,我已经找到了很多关于如何异步读/写文件的例子,但是我很难找到如何使用列表 就写作而言,我有这样一句话,似乎很管用: public async Task<List<string>> GetTextFromFile(string file) { using (var reader = File.OpenText(file)) { var fileText = await reader.ReadToEndAsync(); retu

我已经找到了很多关于如何异步读/写文件的例子,但是我很难找到如何使用列表

就写作而言,我有这样一句话,似乎很管用:

public async Task<List<string>> GetTextFromFile(string file)
{
    using (var reader = File.OpenText(file))
    {
        var fileText = await reader.ReadToEndAsync();
        return fileText.Split(new[] { Environment.NewLine }, StringSplitOptions.None).ToList();
    }
}
公共异步任务GetTextFromFile(字符串文件) { 使用(var reader=File.OpenText(文件)) { var fileText=wait reader.ReadToEndAsync(); 返回fileText.Split(new[]{Environment.NewLine},StringSplitOptions.None).ToList(); } } 不过写作有点棘手

public async Task WriteTextToFile(string file, List<string> lines, bool append)
{
    if (!append && File.Exists(file)) File.Delete(file);
    using (var writer = File.OpenWrite(file))
    {
        StringBuilder builder = new StringBuilder();
        foreach (string value in lines)
        {
            builder.Append(value);
            builder.Append(Environment.NewLine);
        }
        Byte[] info = new UTF8Encoding(true).GetBytes(builder.ToString());
        await writer.WriteAsync(info, 0, info.Length);
    }
}
public异步任务WriteTextToFile(字符串文件、列表行、bool追加)
{
如果(!append&&File.Exists(File))File.Delete(File);
使用(var writer=File.OpenWrite(File))
{
StringBuilder=新的StringBuilder();
foreach(行中的字符串值)
{
附加(值);
builder.Append(Environment.NewLine);
}
Byte[]info=新的UTF8Encoding(true).GetBytes(builder.ToString());
等待WriteAsync(信息,0,信息长度);
}
}
我的问题是,有一段时间,我的数据在内存中似乎是三倍。 我的行的原始列表,然后StringBuilder使用换行符将其变成一个字符串,然后在info中我得到了字符串的字节表示。 我必须在内存中有三个基本相同数据的副本,这似乎太过分了

我担心这一点,因为有时我会读写大型文本文件


接下来,让我澄清一下——我知道对于非常大的文本文件,我可以逐行执行这些操作。我要寻找的是两种读取/写入数据的方法。第一种方法是读入整个过程并进行处理,第二种方法是逐行进行。现在我正在为我的中小型文本文件开发第一种方法。但我仍然担心数据复制问题。

以下内容可能适合您的需要,因为它不会再次存储数据,也不会逐行写入数据:

public async Task WriteTextToFile(string file, List<string> lines, bool append)
{
    if (!append && File.Exists(file))
        File.Delete(file);

    using (var writer = File.OpenWrite(file))
    {
        using (var streamWriter = new StreamWriter(writer))
            foreach (var line in lines)
                await streamWriter.WriteLineAsync(line);
    }
}
public异步任务WriteTextToFile(字符串文件、列表行、bool追加)
{
如果(!append&&File.Exists(File))
文件。删除(文件);
使用(var writer=File.OpenWrite(File))
{
使用(var streamWriter=新streamWriter(writer))
foreach(行中的var行)
等待streamWriter.WriteLineAsync(行);
}
}

你知道你可以多次调用WriteAsync,对吧?嘿-我想我错过了。仅供参考,读写代码实际上都不是异步的。NET中的文件流需要显式打开以进行异步访问。