如何读取然后写入/附加到文本文件而不重新打开文件?

时间:2015-02-25 20:25:43

标签: c# .net .net-4.0 filestream streamreader

如何打开FileStream,读取文件内容,然后(追加)到文件而不重新打开文件?

在这种情况下,StreamReader / StreamWriter的问题是they assume ownwership of the underlying stream。由于目标是.NET 4,因此无法使用"leaveOpen" constructor overloads。 (我不关心是否使用StreamReader / StreamWriter - 但它们确实提供了ReadLine和WriteLine操作。)

总之,与问题相关的有问题代码的示例以及应用程序将如何访问和管理FileStream的生命周期(即要打开一次):

var fs = File.Open(..);
using (var reader = new StreamReader(fs)) {
   // Do all reading here, then ditch the reader
}  // .. but StreamReader will Close the FileStream

SeekToEnd(fs);

using (var writer = new StreamWriter(fs)) {
   // Do all writing here, then ditch the writer
   // .. ideal, but FileStream already Closed
}

// Finally, somewhere else:
fs.Close();

我发现的“相关”MSDN文章总是将其显示为两个单独的步骤:这个问题是关于以面向行的方式执行 Text 的读取 - 写入操作没有两次打开文件。

文件以

打开
File.Open(filename, FileMode.OpenOrCreate, FileAccess.ReadWrite)

并且底层流将始终是可搜索和可写的。

1 个答案:

答案 0 :(得分:4)

您只需将流的位置设置为流的末尾并从那里写入

即可
 fs.Position = fs.Length;
 //then do the write operations you need to do

即使您正在使用流编写器或读取器,您也应该能够修改读取器/写入器正在使用的FileStream,这样您就可以读取然后写入

using(var fs = File.Open(filename, FileMode.OpenOrCreate, FileAccess.ReadWrite)
{
    using(var reader = new TextReader(fs))
    using(var writer = new TextWriter(fs))
    {
        //read

        fs.Position = fs.Length;

        //write
    }
}