【问题标题】:Why can't I open files returned by Perl's readdir?为什么我不能打开 Perl 的 readdir 返回的文件?
【发布时间】:2009-10-13 02:30:15
【问题描述】:

好吧,我知道这是另一个新手问题,但我非常沮丧,我希望再次获得启发。在各位的指导下,我已经学会了如何使用glob函数来读取目录中每个文件的内容。现在我正在尝试使用 readdir-foreach 组合来做同样的事情,但我一直收到“无法打开文件:权限被拒绝”错误。为什么这种情况发生在与管理员相同的目录、相同的文件和相同的我。有人可以告诉我我做错了什么吗?谢谢。

以下代码使用了 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>) {
...}

【问题讨论】:

  • 在你的死亡笔记中,你应该包含文件名($file),而不仅仅是指定文件。你应该在 opendir() 调用中使用变量 $dir - 并在死亡笔记中使用它。
  • 是的,在我的死亡笔记中有 $file,错误信息似乎更具体。运行原始代码给我“无法打开。:权限被拒绝。猜想是因为没有应用 bobbymcr 建议的过滤器。感谢提醒!

标签: perl readdir


【解决方案1】:

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

【讨论】:

  • 只是添加一个可能的解决方案:use File::Spec; open my $data, '&lt;', File::Spec-&gt;catfile($dir, $file);
  • 最好使用 File::Next 或 Path::Class 之类的东西。
  • 感谢安迪的澄清!这很有意义。并感谢 ephemeient 和 jrockway。我现在正在尝试 File::Next 修复。
  • 我尝试了 ephemeient 的修复和 bobbymcr 的过滤器,效果很好:)
  • 在使用 File:Next 修复时遇到了问题。 Perl 给了我一条错误消息,上面写着“无法找到文件/next.pl”。猜猜是因为 File::Next 模块还没有安装。
【解决方案2】:

您应该记住,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 '..')”条件,但我仍然收到一条错误消息,但有些不同。它说“无法打开文件:没有这样的文件或目录”。所以问题可能出在 Andy Ross 建议的地方:readdir 只返回相对路径,而不是完整路径。但同样感谢你!
  • 我认为您的代码有两个问题,两者的结合为您提供了所需的答案。 “权限被拒绝”绝对是您尝试使用 open() 打开目录时遇到的错误。试试open(FILE, "&lt;.") or die "Cannot open FILE:$!"; 看看它的实际应用...
  • 啊,bobbymcr,你可能是对的。如果没有您建议的过滤器,我会收到如下所示的警告:readline() on closed filehandle。谢谢你:)
猜你喜欢
  • 1970-01-01
  • 2016-05-06
  • 1970-01-01
  • 2022-01-18
  • 2021-09-01
  • 2013-05-09
  • 1970-01-01
  • 2015-02-14
  • 2011-03-21
相关资源
最近更新 更多