2013-03-01 39 views
1

我有一个文件,我需要移动到一个特定的文件夹,并在这样做时重命名。在Perl中重命名/移动函数不给结果

use File::Copy "move"; 
print rename('D:\\Test\\Input\\temp.cxx','D:\\Test\\Input\\new.cxx'), die $! ; 

但是这给了我错误说:“权限被拒绝在D:\ Test \ Test.pl 35行,5899行”。我以管理员身份运行。即使所有文件夹都具有完全权限。

更新 它现在工作。在这行之前,我有一行文件打开了。一旦我关闭它,重命名作品。但是,如果我将路径存储在变量中,它又会给我带来同样的错误。

+1

首先,确保该文件在其他程序中未打开。在完成之后,尝试以管理员模式打开cmd并从那里运行脚本。它应该工作 – 2013-03-01 22:23:37

+0

@lonut - 正如我所说,我以管理员身份运行cmd。这是我的整个问题。不管它不工作! – CamelCase 2013-03-01 22:29:29

+0

尝试使用双引号或使斜杠正斜杠。 – squiguy 2013-03-01 22:31:15

回答

4

这里有几个问题。

首先,您使用的是File :: Copy,但不使用任何东西。 rename函数是核心Perl的一部分。

其次,您打印的rename的返回值可能没有意义。它返回一个真或假的值。

第三,您总是die ing,无论移动的返回状态如何。

第四,所有反斜杠都容易出错。

我想你可能打算更像是这样的:

rename('D:/Test/Input/temp.cxx','D:/Test/Input/new.cxx') or die "Unable to rename: $!"; 

这可能有助于暴露你的权限问题。

+0

对不起。它不工作。我认为我的电脑有问题。让我试试另一台PC并回来。 – CamelCase 2013-03-01 22:54:11

+1

谢谢。它正在工作。我在这行之前打开了一行文件。一旦我关闭它,重命名作品。但是,如果我将路径存储在变量中,它又会给我带来同样的错误。 – CamelCase 2013-03-01 23:27:09

+1

@CamelCase Windows的打开文件具有[强制锁定](https://en.wikipedia.org/wiki/File_locking#In_Microsoft_Windows)。如果您(或其他人)的文件可以写入,无论您是否是管理员,都无法移动它。它在Windows上关闭文件句柄非常重要,使用词法文件句柄(例如'open(my $ fh,...)'在文件超出范围时关闭时会有很大帮助 – Schwern 2013-03-02 03:14:29

1

正如Andy所说,除非您在其他地方使用“移动”,否则在您的示例中不需要File :: Copy:下面在我的Win7机器上用Activestate Perl 5.14.2完美工作:

use strict; 
use warnings; 
rename "C:\\Users\\JLBlack\\test.txt", "C:\\Users\\JLBlack\\test.new" or die "rename failed because: $!\n"; 
exit(); 

你确定目的地不存在吗?它没有打开/被其他任何东西使用?你可以从Windows命令提示符移动文件吗?