2013-03-19 39 views
0

因此,我想重命名excel文件,如「test_09182009.xlsx」到「test.xlsx」,並且想覆蓋文件,如果它已經存在。這在我的本地機器上爲我工作,所以我想,但似乎並沒有在網絡目錄中工作。有人有主意嗎?Perl腳本和日期連接移除/文件重命名問題

my $sourceDir = "\\networkPath\; 

opendir (DIR, $sourceDir); 

foreach my $fileName (readdir(DIR)) 
{ 


    if (index($fileName, '_') != -1) 
    { 
     rename($fileName, substr($fileName,0,index($fileName, '_')).".xlsx"); 
    } 
} 
closedir(DIR); 

所以我覺得我已經隔離到腳本不在被重命名的文件的工作目錄中。有沒有一種方法來指定重命名參數?

+0

這是否正在運行視窗? – summea 2013-03-19 06:06:45

+0

是的,它是!!!!!! – 2013-03-19 06:07:53

+0

你沒有檢查'opendir'的返回值。如果你這樣做了,你可能會看到它返回一個錯誤。 – hobbs 2013-03-19 07:50:20

回答

0

嘗試使用正斜槓而不是反斜槓。如

my $sourceDir = "//networkPath/"; 

這與我們的Windows環境中的Active Perl一起工作。

2

人們總是覺得關於readdir(和其他語言中的等價物)感到困惑的事情之一是它只返回目錄中的文件名。它不會返回文件路徑。因此,如果您在/home/example中,並且您在/tmp/example上致電readdir,其中包含文件ab,您從readdir返回的內容僅爲a,而不是/tmp/example/a

通常,無論何時使用readdir的結果,您都需要使用目錄名稱限定文件或將目錄更改爲您打電話給readdir的目錄。

在這種特定的情況下,添加:

my $filePath = $sourceDir . $fileName; 

你的循環頂部(我假設$sourceDir在實際代碼斜槓;您粘貼代碼並不真正關閉報價)然後採取行動$filePath,而不是$fileName。 (如果$sourceDir可以包含下劃線,則需要調整此答案;在這種情況下,您可能需要先生成已轉換的文件名,然後在執行重命名之前使用$sourceDir對它們進行限定。)