gpt4 book ai didi

c# - StreamWriter.Close() 产生空白文件后断电,为什么?

转载 作者:太空狗 更新时间:2023-10-29 19:55:25 25 4
gpt4 key购买 nike

好的,那么解释一下;我正在开发一个可能在任何时间点发生电源故障的系统,我正在测试的一点是在我使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com