【发布时间】:2013-08-18 03:03:13
【问题描述】:
使用cstdio,覆盖文件最安全的方法是什么?在这种情况下,“安全”意味着文件不可能变得不完整或损坏;该文件将被完全覆盖,或者如果出现问题,它将是旧文件。
我想最好的方法是创建一个临时中间文件,然后在该中间文件完成后覆盖旧文件。如果这实际上是最好的方法,那么还有一些其他问题似乎是可能的,尽管很少见。
- 如果程序在覆盖时退出,我怎么知道使用这个其他文件?
- 如果程序在创建期间退出,我怎么知道不使用其他文件?
- 我怎么知道原始文件或 中间处于未定义状态(因为它可能会以某种方式失败 仍然可读,但它包含的数据有细微的错误)?
我想这有一个好的做法,但我一直找不到。这是用于保存的游戏数据;只有一个文件,而且每次都会覆盖整个文件,不用担心部分覆盖或追加。
【问题讨论】:
-
不要覆盖它。选择另一个名字。如果可行,则重命名文件。
-
@HansPassant 这似乎正是第二段所建议的,尽管术语不准确。
-
@HansPassant 阅读 rename() 上的文档,它提到如果新名称已经存在,则操作可能会失败或成功,这取决于实现。
-
我把它写在this answer。如果您在 Windows 中执行此操作,则可以使用 ReplaceFile()。