我写的代码,在我的游戏存档的进步,但我最大的担心之一是在保存时的数据可能会被破坏时的时间短暂窗宜电脑死机或失去动力。如何避免丢失数据时覆盖文件在C被中断
有仅使用C'S标准I/O头的标准方法,以确保以前的存档/文件将是安全的应程序崩溃,覆盖它,不留下临时文件?
我写的代码,在我的游戏存档的进步,但我最大的担心之一是在保存时的数据可能会被破坏时的时间短暂窗宜电脑死机或失去动力。如何避免丢失数据时覆盖文件在C被中断
有仅使用C'S标准I/O头的标准方法,以确保以前的存档/文件将是安全的应程序崩溃,覆盖它,不留下临时文件?
类似观点结合后的意见:
@PC Luddite@Thomas Padron-McCarthy@Martin James
的中心问题是,要么A)在时间上的间隙具有一个有效的“状态”的文件或B)一个小间隔与2之间存在存在有效的文件。所以,最坏的情况下,失败以使用A的0个文件和使用B的2个文件结束。显然B是优选的。
写入状态假设代码可能会在除#1之外的任何步骤之前,期间或之后发生崩溃。
State.txt
。State_tmp1.txt
。要知道这一点,一些检查代码应该是“状态”的一部分。这一步可以与上一步一起作为覆盖。State_tmp1.txt
重命名为State_tmp2.txt
以验证的一些具有重命名权限的代码方面。State.txt
到State_tmp3.txt
。这是关键的一步。到目前为止,任何失败都是无关紧要的,因为存在State.txt
。在下一步完成之前,不存在State.txt
,但至少存在1个tmp文件。State_tmp1.txt
到State.txt
。 (或从State_tmp2.txt
如果步骤4中使用。)读取状态。
State.txt
,如果发现和有效(通行证有效性检查),进入到步骤3算法
代码写入进展(T),t和验证码(校验和,CRC等)在1个文件。
下一次,代码将进度(t + 1),t + 1和其验证代码写入另一个文件。
重复上述两项。
要恢复,阅读文件和肯定至少1将有一个有效的:进步,一些T和验证码。如果两者都很好,则使用后面的一个(更大的t)。
您可以将进度保存到临时文件中,然后当保存完成后,您可以删除原始文件并重命名临时文件。 –
您不需要先删除原始文件,只需重命名临时文件即可。或将原始文件重命名为备份,然后重命名新文件。这是在Unix中使用它的传统方式,消除了删除和重命名之间崩溃导致数据丢失的可能性。我不知道在其他系统(比如Windows)中这么做有多容易。 –
删除和重命名之间的崩溃并不重要。该应用程序会检查启动时是否存在原始文件名和临时文件名,并采取相应的操作。 –