我有一个很常见的情况。我有一个文件,我需要用新内容完全覆盖该文件。但是,每次加载页面时都会访问原始文件(这是一个Web应用程序),所以它不会遗漏很长时间。几毫秒就可以了(虽然不理想),但第二个不行。
现在我通过将临时文件写入同一目录然后将该临时文件重命名为新文件的名称来实现此目的。我只是使用普通的File :: Temp和“重命名”来实现这一点,在Perl中。我在想 - 有没有其他推荐/更好的方法来做到这一点?最好是一个不需要CPAN模块的模块,因为这是我需要在我的系统中唯一需要这样做的地方,而且我不想仅仅因此而需要全新的依赖。
哦,所有这些都必须适用于Windows,Linux,BSD,OS X,Solaris和大多数其他常见平台。
Here is the code in question,感兴趣的人。
答案 0 :(得分:10)
你的方法似乎很好。它很快,它是原子的,它只使用核心模块,File :: Temp是一种处理临时文件的安全方法。你还需要什么?
答案 1 :(得分:6)
我会按照你这样做的方式做到这一点。至少在Unix类型的操作系统上,文件重命名保证是原子的,所以你不会有原始文件或新文件不存在的任何时刻。
答案 2 :(得分:0)
重命名就足够了。但是:
您的临时档案是否有竞争条件的风险?文件名应该是随机的,所以没有人可以通过插入自己的文件来引起问题。如果可能,请使用mkstemp()接口。