为什么我不能打开Perl的readdir返回的文件?

问题描述:

嗯,我知道这是另一个新手问题,但我非常沮丧,我期待再次开悟。在你们的指导下,我已经学会了如何使用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

readdir()函数只返回文件名,而不是完整路径。所以你试图打开例如"foo.txt"而不是“f:\ corpus \ foo.txt”。

+2

只需添加一个可能的解决方案:'使用File :: Spec;打开我的$ data,' 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

您应该记住,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,“ bobbymcr 2009-10-13 03:14:08

+0

啊,bobbymcr,你可能是对的。如果没有你建议的过滤器,我会看到如下所示的警告:readline()关闭文件句柄。谢谢 :) – Mike 2009-10-13 03:35:15