2012-03-20 55 views
1

假设我有一个文件夹包含几个文件,图像,文本,无论如何,它只是有很多文件和文件夹是相当大(> 100 MB)。现在我想更新这个文件夹中的五个文件,但我想以原子方式执行此操作,通常我只是创建一个临时文件夹并将所有内容写入其中,如果成功,则只需替换现有文件夹即可。但是因为I/O比较昂贵,所以我不想这么做(保留数百个文件来更新五个文件似乎是一个巨大的开销)。但是,我该如何以原子方式编写这五个文件呢?请注意,我希望将所有文件写入原子,而不是每个文件分开。原子地写入多个文件

回答

3

你可以调整你的原始解决方案:

  1. 创建一个临时文件夹完整的硬链接的原始文件。
  2. 将五个新文件保存到临时文件夹中。
  3. 删除原始文件夹并将硬链接的文件夹移动到原来的位置。

创建几个链接应该很快,并且避免重写所有文件。

+0

被警告:虽然这样可以避免出现一些新文件存在而其他文件不存在的情况,但这确实意味着有一段时间外部观察者会看到该文件夹​​完全丢失。您不能自动删除旧文件夹并将新文件夹移动到位。 (顺便说一句,步骤3应该是:3a。重新命名原始文件夹,3b。重新命名新文件夹到位,3c。删除重命名的原始文件夹。推迟删除原始文件夹将最小化外部时间观察员可以看到奇怪的东西。) – 2013-06-02 02:07:28

+0

我想到了这种方法的另一个问题。如果某个其他进程在步骤1之后和步骤3a之前在目标中创建文件,该怎么办?例如,考虑两个程序同时采用相同的技术。如果你不小心,你会丢失文件。更安全的方法可能是:在临时位置创建文件,将目标文件夹重命名为ersatz声明独占访问权限的方法,将文件移入,然后重新命名。然而,你试图做的事情本质上是非原子的,你无法真正解决它。你只需要选择你的毒药。 – 2013-06-03 01:24:10