Erw*_*yer 8 .net c# flush stream filestream
我有一个StreamWriter,底层流是一个FileStream.将下面的代码保证的FileStream同时刷新其缓存到文件系统中的实际文件,或者我需要显式调用Flush()的FileStream?
using (var fs = new FileStream("blabla", FileMode.Append)) {
using (var sw = new StreamWriter(fs)) {
sw.WriteLine("Hello, I want to be flushed.");
sw.Flush(); //I need this to also flush onto the file, not just to the FileStream
}
}
Run Code Online (Sandbox Code Playgroud)
根据MSDN," 刷新流不会刷新其底层编码器,除非您明确调用Flush或Close ",但我不知道FileStream是否可以被视为"底层编码器".
此外,如果我没有指定FileOptions.WriteThrough,我保证操作系统最终会将刷新的行写入磁盘,即使程序在两个流关闭之前崩溃(假设例如没有using {}块,只调用Flush())?
在我的场景中,我需要保持流打开(用于记录),所以我不能使用using {}块,但我想确保即使程序崩溃,数据也将始终写入磁盘.如果电源关闭并且操作系统没有刷新到磁盘上,我可以负担得起丢失数据,但是否则我需要操作系统最终刷新,即使我从未正确调用Close()流.
是的,叫Flush上StreamWriter会造成底层流被Flush编.4.5版本调用私有Flush(bool,bool)函数,其结尾为:
if (flushStream)
{
this.stream.Flush();
}
Run Code Online (Sandbox Code Playgroud)
flushStream第一个参数在哪里,this.stream是StreamWriter构造的流,并且调用Flush()是Flush(true,true).
(答案的旧部分 - 我在回答时非常迂回.将答案的最相关部分移到顶部)
它没有在我可以找到的文档中明确说明,但是通过传递另一个流构造的任何流类应该被假定为"取得该流的所有权"(除非特别调用它).
也就是说,一旦你构建了StreamWriter使用fs,你不应该对fs自己进行任何直接的操作.
您从MSDN引用的部分与后面的句子有关:
这允许编码器保持其状态(部分字符),以便它可以正确编码下一个字符块.此方案影响UTF8和UTF7,其中某些字符只能在编码器接收到相邻字符后进行编码.
也就是说,您可能已将数据传递给Write您已经为其提供了一些Unicode代理,但不是完整的字符.Flush不会将这些代理人写入流中.只要你总是将形式良好的(完整的)字符串传递给Write你,你就不需要关心这一点了.