1

假设您有一个程序,如文本编辑器或文字处理器,可以写入用户创建的文件。面对崩溃、空间不足错误、突然断电、竞争条件等,应采取哪些步骤来确保将数据丢失或损坏的风险降至最低?

4

4 回答 4

1

保护重要数据的一个好的经验法则是

永远不要修改唯一的副本

在文字处理器和文本编辑器的情况下,我认为创建“卷影副本”(这可能不是技术术语)是标准,它是进行所有更改的原始文件的副本。定期(或当用户请求时)您可以强制保存包含对原始文件的修改。这样做的好处是,如果任何时候出现故障,总是至少有一个有效的数据副本。

真正的目标是实现原子性——一个操作只能成功或失败,永远不会有不完整的状态。除了“影子副本”之外,还有许多其他方法可以实现原子性,但我相信文本编辑器就是这样做的。

于 2009-07-21T00:20:51.657 回答
0

使用SQLite

好吧,将 DB 用于文本编辑器很奇怪,但是文字处理器具有如此多的状态,这可能是有道理的。当然,它作为多种应用程序的存储格式是有意义的。SQLite wiki 站点上有一个关于将其用于撤消/重做日志的页面。

对于文本编辑器,您可以使用数据库所做的技术:提前写入日志或回滚日志,以及与磁盘的良好提交同步。或者您可以存储每个文件的两个版本。

于 2009-07-21T00:14:48.333 回答
0

我为同样适用于此处的类似问题写了一个较早的答案。步骤是:

  1. 用新数据写入临时文件
  2. 将临时文件移动到原始文件目录中的备份文件。
  3. 执行备份和原始文件的原子交换(Windows 中的 File.Replace 或 Unix 中的交换 inode)。
  4. 删除备份(现在是原始)文件。
于 2009-07-21T00:21:56.633 回答
0

这对于今天的多 GB 机器来说可能已经过时了,但是当我在 mac 上开发时,我记得我们曾经分配一个足够大的内存块来执行保存操作。

如果我们的内存不足,我们可以给用户一个他/她内存不足的警告,然后释放那个块以便实际的保存操作可以发生。

其他对保存用户数据很重要的功能是提供撤消功能——理想情况下是无限制的撤消/重做。

于 2009-07-21T00:26:15.573 回答