在将旧文件放入旧位置之前,我真的可以相信重命名吗?如果不是,更好的方法是什么?我(-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);
答案 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
也不会覆盖现有文件,因为操作系统的工作方式就像它们已经提交到磁盘一样。