完全安全的覆盖保存文件的方法?

Ann*_*inn 3 c++ file save

使用cstdio,覆盖文件的最安全方法是什么?在这种情况下,“安全”意味着文件不可能不完整或损坏;该文件将被完全覆盖,或者如果出现问题,它将是旧文件。

我想最好的方法是创建一个临时中间文件,然后在该中间文件完成后覆盖旧文件。如果这实际上是最好的方法,那么还有一些其他问题似乎是可能的,尽管很少见。

  • 如果程序在覆盖时退出,我怎么知道要使用这个其他文件?
  • 如果程序在创建过程中退出,我怎么知道不使用其他文件?
  • 我怎么知道原始文件或中间文件处于未定义状态(因为它可能以一种保持可读的方式失败,但它包含的数据有细微的错误)?

我想这有一个很好的做法,但我找不到它。这是用于保存的游戏数据;只有一个文件,而且每次都会覆盖整个文件,无需担心部分覆盖或附加。

Mat*_*son 6

正如其他人所说,保留现有文件,并写入一个新文件。如果这是非常重要的(也就是说,用户不可能恢复信息),请确保有一个“备份”文件周围以及(例如,如果你的程序保存abc.config,留下abc.old.configabc.backup[如果你要保证这个名字适用于任何地方,.cfg并且.bak可能是更好的选择])。

编写文件时,请在文件中放置某种结束标记,以确保文件是完整的。如果您想避免对文件进行“用户编辑”,您可能还需要内容的校验和(sha1、md5 或类似的)。如果结束标记不存在,或者校验和错误,那么您就知道该文件是“坏的”,所以不要使用它。去备份。

  1. 将新内容写入临时文件(例如fstream fout("abc.tmp");
  2. 删除备份文件(如果存在)(例如remove("abc.bak");
  3. 将现在的旧文件重命名为备份名称(例如rename("abc.cfg", "abc.bak");
  4. 将新文件重命名为旧文件(例如rename("abc.tmp", "abc.cfg");

对于所有步骤(特别是写入实际数据),检查错误。您需要决定哪里可以出错,哪里可以出错(remove例如,不存在的文件是可以的,但是如果rename不起作用,您可能应该停止,否则您可能会遇到一些不好的事情)。

加载文件时,检查所有步骤,如果出错,返回备份文件。