协同程序/反应式扩展-写行



我使用这两个函数来读取和写入巨大的文件(写入多个文件)。我想在函数中保留文件操作,因为这些行可能是从其他源读取/写入的。

更新: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()

相关内容

  • 没有找到相关文章

最新更新