2015-10-23 40 views
1

我写的代码,在我的游戏存档的进步,但我最大的担心之一是在保存时的数据可能会被破坏时的时间短暂窗宜电脑死机或失去动力。如何避免丢失数据时覆盖文件在C被中断

有仅使用C'S标准I/O头的标准方法,以确保以前的存档/文件将是安全的应程序崩溃,覆盖它,不留下临时文件?

+2

您可以将进度保存到临时文件中,然后当保存完成后,您可以删除原始文件并重命名临时文件。 –

+4

您不需要先删除原始文件,只需重命名临时文件即可。或将原始文件重命名为备份,然后重命名新文件。这是在Unix中使用它的传统方式,消除了删除和重命名之间崩溃导致数据丢失的可能性。我不知道在其他系统(比如Windows)中这么做有多容易。 –

+2

删除和重命名之间的崩溃并不重要。该应用程序会检查启动时是否存在原始文件名和临时文件名,并采取相应的操作。 –

回答

1

类似观点结合后的意见:
@PC Luddite@Thomas Padron-McCarthy@Martin James

的中心问题是,要么A)在时间上的间隙具有一个有效的“状态”的文件或B)一个小间隔与2之间存在存在有效的文件。所以,最坏的情况下,失败以使用A的0个文件和使用B的2个文件结束。显然B是优选的。

写入状态假设代码可能会在除#1之外的任何步骤之前,期间或之后发生崩溃。

  1. 假设存在初始状态(或进度)文件:State.txt
  2. 如果存在,请删除较早的临时文件。 (家务)
  3. 在临时文件中写入新状态:State_tmp1.txt。要知道这一点,一些检查代码应该是“状态”的一部分。这一步可以与上一步一起作为覆盖。
  4. 迂腐步 - 可选。将State_tmp1.txt重命名为State_tmp2.txt以验证的一些具有重命名权限的代码方面。
  5. 重命名State.txtState_tmp3.txt。这是关键的一步。到目前为止,任何失败都是无关紧要的,因为存在State.txt。在下一步完成之前,不存在State.txt,但至少存在1个tmp文件。
  6. 重命名State_tmp1.txtState.txt。 (或从State_tmp2.txt如果步骤4中使用。)
  7. 删除。tmp文件。

读取状态。

  1. 搜索State.txt,如果发现有效(通行证有效性检查),进入到步骤3
  2. 否则,寻求tmp文件,并使用最新有效的。 (更多工作恢复状态还没有详细说明
  3. 清理 - 删除tmp文件。
1

算法

代码写入进展(T),t和验证码(校验和,CRC等)在1个文件。
下一次,代码将进度(t + 1),t + 1和其验证代码写入另一个文件。
重复上述两项。

要恢复,阅读文件和肯定至少1将有一个有效的:进步,一些T和验证码。如果两者都很好,则使用后面的一个(更大的t)。