[英]What is the difference between StreamWriter.Flush() and StreamWriter.Close()?
[英]Power Loss after StreamWriter.Close() produces blank file, why?
好的,这样解释; 我正在开发一个可以在任何时间点出现电源故障的系统,我正在测试的一点是在我使用StreamWriter写出文件之后。 代码如下:
// Write the updated file back out to the Shell directory.
using (StreamWriter shellConfigWriter =
new StreamWriter(@"D:\xxx\Shell\Config\Game.cfg.bak"))
{
for (int i = 0; i < configContents.Count; i++)
{
shellConfigWriter.WriteLine(configContents[i]);
}
shellConfigWriter.Close();
}
FileInfo gameCfgBackup = new FileInfo(@"D:\xxx\Shell\Config\Game.cfg.bak");
gameCfgBackup.CopyTo(@"D:\xxx\Shell\Config\Game.cfg", true);
将shellConfigWriter
(字符串List
)的内容写入用作临时存储的文件,然后将其复制到原始文件上。 现在,在此代码完成执行后,电源丢失,再次启动时,文件Game.cfg
存在并且大小正确,但是完全空白。 起初我认为这是由于在硬盘驱动器上启用了写入缓存,但即使关闭它仍然会发生(尽管不经常)。
任何想法都会非常受欢迎!
更新:好的,所以在删除.Close()
语句并在每次写入操作后调用.Flush()
之后,文件仍然是空白的。 在创建新文件之前,我可以更进一步创建原始文件的备份,然后我有足够的备份来进行完整性检查,但我认为它不会有助于解决根本问题(当我告诉它写入时,刷新并关闭文件......它没有!)。
使用FileStream
对象的构造函数的FileOptions
参数FileOptions
操作系统缓冲输出:
using (Stream fs = new FileStream(@"D:\xxx\Shell\Config\Game.cfg.bak", FileMode.Create, FileAccess.Write, FileShare.None, 0x1000, FileOptions.WriteThrough))
using (StreamWriter shellConfigWriter = new StreamWriter(fs))
{
for (int i = 0; i < configContents.Count; i++)
{
shellConfigWriter.WriteLine(configContents[i]);
}
shellConfigWriter.Flush();
shellConfigWriter.BaseStream.Flush();
}
首先,您不必在那里调用shellConfigWriter.Close()
。 using
语句将处理它。 您可能想要做的是防止电源故障,而是调用shellConfigWriter.Flush()
。
更新
您可能想要考虑的其他事情是,如果电源故障在任何时候都可能发生,那么它可能发生在写入过程中,这样只有部分字节才能使其成为文件。 真的没有办法阻止它。
为了防止这些情况,常见的过程是使用状态/条件标志文件。 您使用具有特定名称的零字节文件的文件系统上存在或不存在来告诉程序在恢复时再次拾取的位置。 然后,在确定已达到该状态并完成之前的状态之前,不要创建或销毁触发特定状态的文件。
这里的缺点是它可能意味着不时地抛弃大量工作。 但好处是它意味着代码的功能部分看起来很正常:要使系统足够健壮,只需要做很多额外的工作。
你想设置AutoFlush = true;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.