2014-09-03 58 views
1

我正在使用这两个函数来读写大文件(写入多个文件)。我想保留函数中的文件操作,因为这些行可能是从其他源读取/写入的。协同/反应式扩展 - 写入行

更新: 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); 
      } 
    } 
+0

您的第一个方法可以替换为'File.ReadLines',第二个方法可以替换'File.WriteLines' – 2014-09-03 13:58:46

+0

是否需要一次处理一行(例如非常大的文件)? Otherweise,File.ReadAllLines没问题。 – WeSt 2014-09-03 14:01:23

+0

@SriramSakthivel:你只需要小心不要使用'File.WriteAllLines(“path”,File.ReadLines(“path”))''它会尝试写入你正在阅读的文件。 – 2014-09-03 14:02:52

回答

6

只需使用File.WriteAllLines。它会将序列中的所有行写入文件,并且不会为每行打开/关闭文件。

+0

这些行由代码生成,可能是数百万行。 – ca9163d9 2014-09-03 14:02:44

+1

@ dc7a9163d9好的。没关系。此方法将逐个读取序列中的行并将其写出,而不会将整个内容缓存到内存中。如果你愿意,你可以有数十亿行。 – Servy 2014-09-03 14:04:23

+0

也许使主循环返回一个函数yield'IEnumerable '并将它传递给'File.WriteAllLines'。 – ca9163d9 2014-09-03 14:28:21

0

您可以删除整个第二种方法,并用var writer = new StreamWriter(file, true)替代呼叫,如that constructor creates the file if it does not exist

然后,您可以使用writer.WriteLine(),直到完成写作为止,然后再使用Dispose()

+0

但他不关心创建文件。他不想重复打开和关闭它,只是写一行。 – 2014-09-03 14:03:56

+0

我只是说这是一种无用的方法,OP的问题可以通过我在我的回答中说明来解决。如果这不能回答他的问题,OP应该给出更多的上下文(比如“我不想保留一个参考”)。 OP不想为他写的每一行打开和关闭文件,那么他应该在某处保留对作者的引用(请参阅:我的回答)或一次写出所有行(请参阅:@Servy的答案)。 – CodeCaster 2014-09-03 14:04:44