我发布此问题是因为没有找到确切的答案。
问题:在我正在使用的其中一个应用程序中,我们需要考虑编码中的停电/异常停机。应用程序在运行时修改/创建一些文件(让我们假设一个简单的.txt文件)。
观察到当应用程序运行时发生电源故障时,所有创建/修改的文件都已损坏。确切地说,我们可以看到文件的元数据,但是如果我们打开文件,所有内容都将消失,文件为空。当我们在Notepad ++中打开文件时,文件将填充NULL。
由于一些操作系统优化机制,所有文件内容都会被写入磁盘,即使从技术上讲我们之前完成了写操作。
技术细节:该应用程序位于c ++上。我们使用普通的CStdioFile调用进行FILE IO操作。
问题:是否有任何编码方法可以避免这些文件损坏?
答案 0 :(得分:1)
唯一的应用程序级解决方案(没有进入聪明的文件系统等)是保留旧的"未更改的副本#34;文件,以便您可以恢复到" safe"状态。
如果有人在写入中间插入插件,那么您写入的文件几乎肯定是腐败的,但如果您正在处理副本并且仍然拥有原件,那么您可以忘记损坏的副本和"后退"原来的。
答案 1 :(得分:1)
是的,有。
将新版本写入目标文件夹中的另一个文件。我通常使用this method将扩展名替换为“.tmp”,但在现代C ++中,还有一种内置的跨平台方式,replace_extension。
完成后,刷新并关闭文件。这将导致操作系统将更改写入HDD。然后用例如带有MOVEFILE_REPLACE_EXISTING标志的MoveFileEx用新写入的临时文件替换目标文件。替换操作是almost always原子。