异步读写文本行

时间:2017-03-15 15:42:01

标签: c# asynchronous text

我发现了很多关于如何异步读/写文件的例子,但是我很难找到如何用List做的。

对于写作,我有这个,这似乎有效:

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();
    }
}

虽然写作有点棘手......

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);
    }
}

我的问题是,有一刻我的数据显示内存为三倍。 我的行的原始List,然后StringBuilder使它成为带有换行符的单个字符串,然后在info中我有字符串的字节表示。 这似乎太过分了,我必须在内存中拥有三份基本相同的数据。

我对此感到担心,因为有时我会阅读和编写大型文本文件。

接下来,让我说清楚 - 我知道对于非常大的文本文件,我可以逐行完成。我正在寻找的是两种读/写数据的方法。第一个是阅读整个事物并处理它,第二个是逐行完成。现在我正在为我的中小型文本文件开发第一种方法。但我仍然担心数据复制问题。

1 个答案:

答案 0 :(得分:0)

以下内容可能符合您的需求,因为它不会再次存储数据以及逐行编写数据:

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);
    }
}