2009-10-13 188 views
1

嗯,我知道這是另一個新手問題,但我非常沮喪,我期待再次開悟。在你們的指導下,我已經學會了如何使用glob函數來讀取目錄中每個文件的內容。現在我正在嘗試readdir-foreach組合來做同樣的事情,但我一直收到「無法打開文件:權限被拒絕」的錯誤。爲什麼這會發生在與管理員相同的目錄,相同的文件和相同的我。有人可以告訴我我做錯了什麼嗎?謝謝。爲什麼我不能打開Perl的readdir返回的文件?

下面的代碼使用的glob功能,它的工作原理:

#! perl 
my $dir = 'f:/corpus/'; 
my @files = glob "$dir/*"; 
foreach my $file (@files) { 
open my $data, '<',"$file" or die "Cannot open FILE"; 
while(<$data>) { 
...} 

下面的代碼失敗和錯誤消息指出「無法打開文件:權限被拒絕」。但爲什麼?

#! perl 
my $dir = 'f:/corpus/'; 
opendir (DIR,'f:/corpus/') or die "Cannot open directory:$!"; 
my @files=readdir(DIR); 
closedir DIR; 
foreach my $file (@files) { 
open my $data, '<',"$file" or die "Cannot open FILE:$!"; 
while(<$data>) { 
...} 
+0

在你的死亡筆記中,你應該包括文件的名字($ file),而不僅僅是指定FILE。你應該在opendir()調用中使用變量$ dir - 並在死亡筆記中使用它。 – 2009-10-13 02:48:23

+0

是的,我的死亡筆記中有$ file,錯誤信息似乎更具體。運行原始代碼給我「不能打開。:Permission denied。猜猜是因爲bobbymcr建議的過濾器沒有應用。感謝提醒! – Mike 2009-10-13 03:55:17

回答

8

readdir()函數只返回文件名,而不是完整路徑。所以你試圖打開例如"foo.txt"而不是「f:\ corpus \ foo.txt」。

+2

只需添加一個可能的解決方案:'使用File :: Spec;打開我的$ data,'<',File :: Spec-> catfile($ dir,$ file);' – ephemient 2009-10-13 02:39:00

+0

更好使用類似File :: Next或Path :: Class的東西 – jrockway 2009-10-13 02:43:58

+0

謝謝Andy的澄清! – Mike 2009-10-13 03:05:19

4

您應該記住,readdir返回目錄名稱文件名。最有可能你正試圖打開特殊的目錄條目...,你通常需要過濾掉,如果你使用這些功能中的一個:

foreach my $f (@files) 
{ 
    # skip special directory entries 
    if ($f ne '.' && $f ne '..') 
    { 
     # ... 
     print "$f\n"; 
    } 
} 

還要注意Andy Ross「的建議,這將只返回相對路徑,而不是完整的路徑。

+0

謝謝bobbymcr。我添加了「if($ f ne'。'&& $ f ne'..')」條件,但我仍然收到一條錯誤消息,但有些不同。它說「無法打開文件:沒有這樣的文件或目錄」。所以這個問題可能在於安迪羅斯的建議:readdir只返回相對路徑,而不是完整路徑。但是,謝謝你一樣! – Mike 2009-10-13 03:02:00

+0

我認爲你的代碼有兩個問題,兩者的結合爲你提供了你需要的答案。 「權限被拒絕」肯定是您嘗試使用open()打開目錄時得到的錯誤。嘗試'打開(FILE,「<。」)或死「無法打開FILE:$!」;'看到它在行動... – bobbymcr 2009-10-13 03:14:08

+0

啊,bobbymcr,你可能是對的。如果沒有你建議的過濾器,我會看到如下所示的警告:readline()關閉文件句柄。謝謝 :) – Mike 2009-10-13 03:35:15

相關問題