在覆盖之前,我可以信任Perl重命名吗?

时间:2014-04-04 15:54:40

标签: perl rename

在将旧文件放入旧位置之前,我真的可以相信重命名吗?如果不是,更好的方法是什么?我(-e test.old)是为了确保它被移动还是不必要的?

rename("test", "test.old") || die "Can't rename test";

open(FILE, ">test") || die "Can't write to test";
print FILE "foo";
close(FILE);

3 个答案:

答案 0 :(得分:2)

有许多事情可以使重命名失败,因此添加if (-e "test") { die "File not renamed beforehand!\n" }是一种廉价的保险政策。

在你的情况下,老实说,如果没有触发你已经拥有的die条件,我就不会想到重命名失败的原因,但是如果覆盖是灾难性的,那么额外的磁盘读取作为安全措施可能仍然值得它

答案 1 :(得分:0)

也无法想到为什么or die无法解决rename出错的任何原因。哎呀,我满足于依赖use autodie;

但是,perlfaq5和How come when I open a file read-write it wipes it out?还有另一种进行健全性检查的方法。

如果要打开文件进行书写,创建新文件,文件必须不存在,则可以使用sysopen

use Fcntl;

sysopen my $fh, $path, O_WRONLY|O_EXCL|O_CREAT or die $!;

答案 2 :(得分:0)

  

在将旧文件放入旧位置之前,我真的相信重命名会完成吗?

是。在unlink(2)返回之前始终会调用rename

操作系统可能没有将更改提交到磁盘,因此在那个时刻断电可以在理论上“取消删除”该文件。

但是即便如此,open也不会覆盖现有文件,因为操作系统的工作方式就像它们已经提交到磁盘一样。