2013-03-04 72 views
0

我有一个文件,我必须添加2行。 为此,我打开文件,读取行,添加新行并将文件另存为新的临时文件。现在我想删除原始文件并将新文件重命名为原始文件名。但不知何故,它不会发生。Perl - 文件删除没有发生

unlink $file; 
rename($outfile,"D:/Test/Original.cxx") or die; 

这就是我刚才试图做的。 任何帮助!

+0

哪一行失败 - 'unlink'或'rename'?什么是“死”错误消息? – emallove 2013-03-04 21:28:26

+0

它在重命名时死亡。它说“权限被拒绝”。 – CamelCase 2013-03-04 21:32:58

+1

其中一个有问题的文件是打开的 – ikegami 2013-03-04 22:09:50

回答

1

你应该尝试测试命令的输出。 unlink命令返回删除的文件数量。您可以使用此信息判断文件是否被删除或不:

unlink $file or die qq(Cannot delete file "$file"\n; 
rename $outfile, $file or die qq(Cannot rename file "$outfile" to "$file\n); 

这会给你一个想法unlink是否失败或rename。有可能文件仍处于打开状态。如果您要添加行的文件,请确保您使用close关闭文件句柄第一:

open my $in_fh, "<", $file or die qq(Cannot open "$file" for reading\n); 
open my $out_fh, ">", $outfile or die qq(Cannot open file "$outfile" for writing\n) 

... #What ever you're doing 

close $in_fh;  #Close your files, so nothing is holding them open. 
close $out_fh; 
unlink $file or qq(Cannot delete file "$file"\n); 
rename $outfile, $file or qq(Cannot rename "$outfile" to "$file"\n); 

在Windows上,它关闭做任何事情之前所有的文件句柄就显得尤为重要。即使是读取也会阻止您对文件执行任何操作。

+0

我已关闭文件句柄。现在删除正在发生。 BU重命名我的数据完全丢失。任何想法为什么可能是这种情况 – CamelCase 2013-03-04 23:33:16

+0

尝试重命名时是否收到错误消息?使用'File :: Copy'模块(在你的程序中放置'use File :: Copy'',并且使用'copy $ outfile,$ file;'这样的方式,如果复制失败 – 2013-03-04 23:44:30

+0

编号我在重命名时没有收到任何错误消息,实际上返回代码也是'1',所以我做了这件事,我首先将数据从'$ outfile'复制到'$ file'。然后'unlink $ outfile'。这个工作! – CamelCase 2013-03-04 23:53:46

1

如果仍然不能正常工作,你应该得到一个很好的线索,为什么

unlink($file) && rename($outfile,$file) or die "$! $file";