【问题标题】:What's the best way to do a cross-platform, atomic file replacement in Perl?在 Perl 中进行跨平台、原子文件替换的最佳方法是什么?
【发布时间】:2010-09-28 08:48:09
【问题描述】:

我有一个很常见的情况。我有一个文件,我需要用新内容完全覆盖该文件。但是,每次页面加载时都会访问原始文件(这是一个 Web 应用程序),因此它不会丢失很长时间。几毫秒是可以的(虽然不理想),一秒钟是不行的。

现在我通过将一个临时文件写入同一目录然后将该临时文件重命名为新文件的名称来执行此操作。我只是在 Perl 中使用普通的 File::Temp 和“重命名”来执行此操作。我想知道——还有其他推荐/更好的方法吗?最好是不需要 CPAN 模块的,因为这是我系统中唯一需要这样做的地方,而且我不想要一个全新的依赖项。

哦,所有这些都必须在 Windows、Linux、BSD、OS X、Solaris 和大多数其他常见平台上运行。

Here is the code in question,给感兴趣的人。

【问题讨论】:

    标签: perl file filesystems rename atomic


    【解决方案1】:

    您的方法似乎很好。它很快,它是原子的,它只使用核心模块,并且 File::Temp 是一种处理临时文件的安全方法。你还需要什么?

    【讨论】:

    • 嗯,可能只是确认这确实是最好的方法。 :-) 我主要是想知道是否有任何其他特别推荐的方法来做到这一点,因为无论如何我都在查看有问题的代码(修复错误),我认为如果需要,现在是改进它的好时机. :-)
    【解决方案2】:

    我会按照你的方式来做。至少在 Unix 类型的操作系统上,文件重命名保证是原子的,因此您不会有任何瞬间原始文件或新文件不存在。

    【讨论】:

      【解决方案3】:

      重命名就足够了。然而:

      您的临时文件是否存在竞争条件的风险?文件名应该是随机的,所以没有人可以通过插入自己的文件来引起问题。如果可能,使用 mkstemp() 的接口。

      【讨论】:

      • 我很确定 File:Temp 是正确随机化的。
      • 是的,File::Temp 已正确随机化,这就是代码中 XXXXX 的用途。
      • File::Temp 是 Perl 的 mkstemp 等价物,在编写时非常注重安全性。
      猜你喜欢
      • 2011-12-18
      • 2010-09-21
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多