所以我创建了一个非常简单的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。
答案 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) {
...
}