我现在有3个报告用户的机器在使用我的软件时崩溃..崩溃与我的程序无关,但是当他们重新启动配置文件时,我的程序写入都是损坏的.
编写文件没有什么特别之处,只需创建一个Json表示并使用File.WriteAllText()将其转储到磁盘上
// save our contents to the disk
string json = JsonConvert.SerializeObject(objectInfo, Formatting.Indented);
// write the contents
File.WriteAllText(path, json);
Run Code Online (Sandbox Code Playgroud)
我有一个用户发给我一个文件,长度看起来正确(~3kb),但内容都是0x00.
根据下面的帖子,File.WriteAllText应该关闭文件句柄,将任何未写入的内容刷新到磁盘:
但正如Alberto在评论中指出的那样:
System.IO.File.WriteAllText完成后,将所有文本刷新到文件系统缓存,然后,它将被懒惰地写入驱动器.
所以我认为这里发生的事情是文件被清除并用0x00初始化,但是当系统崩溃时数据还没有被写入.
我想可能使用某种临时文件,所以过程将是这样的:
我认为这不会解决问题,因为我认为即使IO仍处于待决状态,Windows也只会移动文件.
有什么方法可以强制机器将数据转储到磁盘而不是决定何时进行,或者更新文件更好的方法?
更新:
基于@usr,@ mikez和@llya luzyanin的建议,我创建了一个新的WriteAllText函数,它使用以下逻辑执行写入:
有了这个逻辑,如果最终文件加载失败,我的代码会检查备份文件并加载它
这是代码:
public static void WriteAllTextWithBackup(string path, string contents)
{
// generate a temp filename
var tempPath = Path.GetTempFileName();
// create the backup name
var backup = path + ".backup";
// delete any existing backups
if (File.Exists(backup))
File.Delete(backup);
// get the …Run Code Online (Sandbox Code Playgroud) 当Windows XP和Vista中的磁盘策略设置为在硬盘上启用写入缓存时,是否有办法刷新刚刚写入的文件,并确保它已提交到磁盘?
我想在C++中以编程方式执行此操作.
关闭文件会在应用程序级别执行刷新,但不会在操作系统级别执行刷新.如果在关闭文件后从PC中断电,但在操作系统刷新磁盘写入缓存之前,文件将丢失,即使它已关闭.