为什么我不能打开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>) {
...}
您应该记住,readdir
返回目录名称和文件名。最有可能你正试图打开特殊的目录条目.
或..
,你通常需要过滤掉,如果你使用这些功能中的一个:
foreach my $f (@files)
{
# skip special directory entries
if ($f ne '.' && $f ne '..')
{
# ...
print "$f\n";
}
}
还要注意Andy Ross“的建议,这将只返回相对路径,而不是完整的路径。
谢谢bobbymcr。我添加了“if($ f ne'。'&& $ f ne'..')”条件,但我仍然收到一条错误消息,但有些不同。它说“无法打开文件:没有这样的文件或目录”。所以这个问题可能在于安迪罗斯的建议:readdir只返回相对路径,而不是完整路径。但是,谢谢你一样! – Mike 2009-10-13 03:02:00
我认为你的代码有两个问题,两者的结合为你提供了你需要的答案。 “权限被拒绝”肯定是您尝试使用open()打开目录时得到的错误。尝试'打开(FILE,“ bobbymcr 2009-10-13 03:14:08
啊,bobbymcr,你可能是对的。如果没有你建议的过滤器,我会看到如下所示的警告:readline()关闭文件句柄。谢谢 :) – Mike 2009-10-13 03:35:15
在你的死亡笔记中,你应该包括文件的名字($ file),而不仅仅是指定FILE。你应该在opendir()调用中使用变量$ dir - 并在死亡笔记中使用它。 – 2009-10-13 02:48:23
是的,我的死亡笔记中有$ file,错误信息似乎更具体。运行原始代码给我“不能打开。:Permission denied。猜猜是因为bobbymcr建议的过滤器没有应用。感谢提醒! – Mike 2009-10-13 03:55:17