8

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

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

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

这是有问题的代码,对于那些感兴趣的人。

4

3 回答 3

10

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

于 2008-12-24T18:53:25.680 回答
6

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

于 2008-12-24T18:54:38.843 回答
0

重命名就足够了。然而:

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

于 2008-12-24T19:07:33.310 回答