Perl:循环遍历目录并获取不存在的目录?

时间:2014-12-19 21:58:37

标签: perl strawberry-perl

所以我创建了一个非常简单的Perl脚本来遍历C:盘上的所有内容并搜索具有特定名称的内容。现在,它给了我这个错误:

Can't open directory C:\ProgramData\Application Data: Invalid argument at C:\Use  
rs\Alexander\Desktop\Coding\Perl\tree.pl line 41  
Press any key to continue . . .  

现在,C:\ ProgramData是一个不存在的文件。 (已解决)所以,我的问题是,为什么要打开这个文件?这是我的代码:

my $dir = dir("C:\\");
my $c = 0;
recurse($dir);
sub recurse {
    my $v = 0;
    while(my $file = $_[0]->next) {
        $v++;
        next if $v < 3;
        if($file->stringify eq "Program Files") {
            print $file->stringify;
            $c++;
        }
        recurse($file) if $file->is_dir();
    }
}
print "Total: $c";

非常感谢任何帮助 另外,我正在使用File :: Find(不再是)和Path :: Class。

1 个答案:

答案 0 :(得分:1)

首先,C:\ProgramData确实存在。配置资源管理器以显示隐藏文件,或转到控制台并执行dir /a c:\,您将看到它。

该错误适用于C:\ProgramData\Application Data。现在,我没有该名称的目录,但是C:\Config.Msi出现了类似的错误。它被标记为系统文件。最好避免这些。

您可以使用eval来捕获错误并在收到错误时忽略该目录,或者您可以使用Win32 :: File跳过被抢先标记为系统文件的dircetories。


调用约定是C-ish而不是Perlish。

use Win32::File qw( GetAttributes SYSTEM );

GetAttributes($qfn, my $attrs)
   or die("$^E");

if ($attrs & SYSTEM) {
   ...
}