【发布时间】:2015-02-25 20:25:43
【问题描述】:
如何打开 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)
并且底层流将始终是可查找和可写的。
【问题讨论】:
-
为什么必须先关闭阅读器才能打开编写器?为什么不能同时打开它们?
-
@gunr2171 “长时间运行的应用程序”。第一阶段是重播日志,第二阶段是附加到同一个日志。虽然我可以无限期地保留阅读器,这样它就永远不会关闭,我真的很想找到一个“更好”的方法。
-
我认为关于流阅读器最重的事情是实际的流,我不认为只让它们都打开有什么害处,在你的情况下解决这个问题的唯一其他方法是实施不处理文件流的新流读取器和写入器
-
这不是关于“使用资源”(毕竟只有一个 FileStream,并且阅读器使用的整个缓冲区无关紧要) - 这是关于使用字段“摇头”只是为了维护读取器生命周期(必须保持 GC-alive)并在读取周围使用
using省略(这是本地操作,写入将发生多次,直到父级被释放)。 -
@user2864740 我知道你想这样做(因为这样更有意义)但你要么必须自己实现它,要么只保持变量打开,或者升级到一个版本.NET 允许您使用您提到的标志来保持文件流打开
标签: c# .net .net-4.0 filestream streamreader