【发布时间】:2020-08-15 18:07:28
【问题描述】:
我正在尝试使用目录句柄读取 Perl 文件夹中的文件。该脚本能够显示文件名,但会引发两个错误:readdir() attempted on invalid dirhandle DIR 和 closedir() attempted on invalid dirhandle DIR。
我正在调用一个子程序并传递两个值:
if($fileEnding eq "directory")
{
print "$fileName is a directory\n";
FolderInvestigator1($a, $fileName);
}
$a 保存通过命令行参数传递的目录名称及其路径。我将控制权传递给子程序。
下面是我的代码:-
sub FolderInvestigator1
{
my $prevPath = shift;
my $receivedFolder = shift;
my $realPath = "$prevPath/$receivedFolder";
my $path = File::Spec->rel2abs($realPath);
print "$path\n";
print "$receivedFolder Folder Received\n";
opendir(DIR, $path) or die "You've Passed Invalid Directory as Arguments\n";
while(my $fileName = readdir DIR)
{
next if $fileName =~ /^\./;
print "The Vacant Folder has $fileName file\n";
}
closedir(DIR);
}
这是我的完整代码:-
FirstResponder();
sub FirstResponder
{
if (@ARGV == 0)
{
print "No Arguments Passed\n";
}
else
{
foreach my $a(@ARGV)
{
print "Investigating $a directory below:-\n";
opendir(DIR, $a) or die "You've Passed Invalid Directory as Arguments\n";
while(my $fileName = readdir DIR)
{
next if $fileName =~ /^\./;
$ending = `file --mime-type $a/$fileName`;
#print $ending;
$fileEnding = `basename -s $ending`;
#print $fileEnding;
chomp($fileEnding);
#print $fileName,"\n";
if($fileEnding eq "directory")
{
print "$fileName is a directory\n";
FolderInvestigator1($a, $fileName);
}
else
{
CureExtensions($a, $fileName);
}
}
closedir(DIR);
my @files = glob("$a/*");
my $size = @files;
if($size == 0)
{
print "The $a is an empty directory\n";
}
}
}#Foreach Ends Here..
}
请查看屏幕截图以了解更多信息!
即使我使路径正确,我也无法理解为什么目录句柄会引发错误。一些指导将不胜感激。
【问题讨论】:
-
您正在第二次使用
opendir(DIR, ...)...closedir(DIR),然后才完成第一个句柄DIR。我建议你使用词法目录句柄而不是全局句柄。 -
嗨@HåkonHægland。谢谢你的建议。我实际上是 Perl 的新手,因此任何有关 Lexical Dir Handles 的参考资料对我来说都是很棒的。谢谢!!
-
@Leon S Kennedy Lexial 文件和目录句柄只是您使用的标量变量,而不是
DIR- 该变量获取对句柄的引用。使用类似my $dirhandle; opendir($dfirhandle, $a) or die;(或opendir(my $dirhandle, $a)...,如果你想花哨的话。my使它成为词法(范围私有)。 -
嗨@Silvar,感谢您的通知。我尝试使用它们。但是,错误仍然存在。实际上,我在最上面声明了它。顺便说一句,没有进展。
-
你的脚本中有
use strict; use warnings;吗?