我使用这两个函数来读取和写入巨大的文件(写入多个文件)。我想在函数中保留文件操作,因为这些行可能是从其他源读取/写入的。
更新:C#并没有真正的协同程序。它是Reactive扩展的良好用例吗?
foreach (var line in ReadFrom("filename"))
{
try
{
.... // Some actions based on the line
var l = .....
WriteTo("generatedFile1", l);
}
catch (Exception e)
{
var l = ..... // get some data from line, e and other objects etc.
WriteTo("generatedFile2", l);
}
}
以下函数打开文件一次,直到读取完所有行,然后关闭并释放资源。
private static IEnumerable<string> ReadFrom(string file)
{
string line;
using (var reader = File.OpenText(file))
{
while ((line = reader.ReadLine()) != null)
yield return line;
}
}
但是,下面的函数(写入行而不是读取行)会为它写入的每一行打开和关闭文件。是否可以实现它,使其只打开一次文件并继续写入文件,直到发送EOF?
private static void WriteTo(string file, string line)
{
if (!File.Exists(file)) // Remove and recreate the file if existing
using (var tw = File.CreateText(file))
{
tw.WriteLine(line);
}
else
using (var tw = new StreamWriter(file, true))
{
tw.WriteLine(line);
}
}
只需使用File.WriteAllLines
。它会将序列中的所有行写入一个文件,并且不会为每一行打开/关闭文件。
您可以删除整个第二个方法,并将调用替换为var writer = new StreamWriter(file, true)
,因为该构造函数会在文件不存在的情况下创建该文件。
然后,您可以使用writer.WriteLine()
,直到您写完为止,然后再使用Dispose()
。