【问题标题】:Write multiple files atomically原子地写入多个文件
【发布时间】:2012-04-05 08:54:12
【问题描述】:

假设我有一个包含一些文件、图像、文本等的文件夹,只要有多个文件并且该文件夹相当大 (> 100 mb) 就很重要。现在我想更新此文件夹中的五个文件,但我想自动执行此操作,通常我只会创建一个临时文件夹并将所有内容写入其中,如果成功,只需替换现有文件夹。但是因为 I/O 很昂贵,我真的不想这样做(为了更新五个文件而重新保存数百个文件似乎是一个巨大的开销)。但是我应该如何原子地编写这五个文件呢?注意,我希望所有文件的写入都是原子的,而不是单独的每个文件。

【问题讨论】:

    标签: macos cocoa nsfilemanager


    【解决方案1】:

    您可以调整您原来的解决方案:

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

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

    【讨论】:

    • 请注意:虽然这样可以避免出现某些新文件存在而其他文件不存在的情况,但这确实意味着外部观察者有时会看到文件夹完全失踪。您不能自动删除旧文件夹并将新文件夹移动到位。 (顺便说一下,第3步应该是:3a.重命名原始文件夹,3b.将新文件夹重命名到位,3c.删除重命名的原始文件夹。推迟删除原始文件夹将最大限度地减少在外面的时间观察者可以看到一些奇怪的东西。)
    • 我想到了这种方法的另一个问题。如果其他进程在步骤 1 之后和步骤 3a 之前在目标中创建文件怎么办?例如,考虑同时使用相同技术的两个程序。如果你不小心,你会丢失文件。一种更安全的方法可能是:在临时位置创建文件,将目标文件夹重命名为声称对它的独占访问权的替代方法,将文件移入,然后将其重命名。但是,您尝试做的事情本质上是非原子的,您无法真正绕过它。你只需要选择你的毒药。
    猜你喜欢
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    相关资源
    最近更新 更多