所以我的应用程序经常想要保存文件以便稍后再次加载。最近因崩溃而倒霉,我想以这样一种方式编写操作,即保证我有新数据或原始数据,但没有损坏的混乱。
我的第一个想法是按照以下方式做一些事情(保存一个名为 example.dat 的文件):
- 为目标目录提供一个唯一的文件名,例如 example.dat.tmp
- 创建该文件并将我的数据写入其中。
- 删除原始文件(example.dat)
- 将临时文件重命名(“移动”)到原始文件所在的位置(example.dat.tmp -> example.dat)。
然后在加载时应用程序可以遵循以下规则:
- 如果没有“example.dat”也没有“example.dat.tmp”,首先运行/新建项目,所以加载默认值/创建新文件。
- 如果“example.dat”且没有“example.dat.tmp”,则加载 example.dat(正常负载情况)
- 如果存在“example.dat.tmp”,则为用户提供潜在恢复数据的机会。如果“example.dat”也存在,请不要在没有明确用户常量的情况下覆盖它。
但是,做了一些研究后,我发现除了我可以用文件刷新方法覆盖的操作系统缓存之外,一些磁盘驱动器仍然在内部缓存,甚至可能对操作系统说它们已经完成,所以 4 . 可以完成,写入实际上并没有写入,如果系统出现故障,我已经丢失了我的数据......
我不确定磁盘问题实际上是否可以通过应用程序解决,但上述一般规则是否正确?我是否应该将文件的旧恢复副本保留更长时间以确保,关于这些事情的指导方针是什么(例如,可接受的磁盘使用情况,用户应该选择,将这些文件放在哪里等)。
另外我应该如何避免“example.dat.tmp”的用户和其他程序的潜在冲突。我记得有时会从其他一些软件中看到“~example.dat”,这是一个更好的约定吗?