- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
好的,那么解释一下;我正在开发一个可能在任何时间点发生电源故障的系统,我正在测试的一点是在我使用 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
参数防止操作系统缓冲输出:
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();
}
关于c# - StreamWriter.Close() 产生空白文件后断电,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1427288/
对于我正在构建的系统,我需要一个视频编解码器,它可以承受断电 - 即,如果断电,视频仍然需要从闪存盘上剩余的内容中播放。 (车载电脑项目,拔下 key 后电脑立即关闭,如果在事故中断电)。 谁能推荐合
是否可以创建一个逻辑应用来监视特定虚拟机并发送有关断电/通电或 CPU 使用率百分比的电子邮件通知? 我已经阅读了事件网格,但它似乎更适合资源创建/删除通知,而不是特定的虚拟机信号。 我也知道可以在虚
我是一名优秀的程序员,十分优秀!