2013-03-01 40 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命令提示符移動文件嗎?