我发现了很多关于如何异步读/写文件的例子,但是我很难找到如何用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中我有字符串的字节表示。 这似乎太过分了,我必须在内存中拥有三份基本相同的数据。
我对此感到担心,因为有时我会阅读和编写大型文本文件。
接下来,让我说清楚 - 我知道对于非常大的文本文件,我可以逐行完成。我正在寻找的是两种读/写数据的方法。第一个是阅读整个事物并处理它,第二个是逐行完成。现在我正在为我的中小型文本文件开发第一种方法。但我仍然担心数据复制问题。
答案 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);
}
}