使用Perl检测空目录

Chr*_*son 12 directory perl file

在perl中测试文件夹是否为空的简单方法是什么?-s和-z不起作用.

例:

#Ensure Apps directory exists on the test PC.
if ( ! -s $gAppsDir )
{ 
    die "\n$gAppsDir is not accessible or does not exist.\n"; 
}

#Ensure Apps directory exists on the test PC.
if ( ! -z $gAppsDir )
{ 
    die "\n$gAppsDir is not accessible or does not exist.\n"; 
}
Run Code Online (Sandbox Code Playgroud)

以上这些,不能正常告诉我文件夹是空的.谢谢!


谢谢大家!我最终使用:

sub is_folder_empty { my $dirname = shift; opendir(my $dh, $dirname) or die "Not a directory"; 
return scalar(grep { $_ ne "." && $_ ne ".." } readdir($dh)) == 0; }
Run Code Online (Sandbox Code Playgroud)

Bra*_*ick 24

为了清晰起见,有点冗长,但是:

sub is_folder_empty {
    my $dirname = shift;
    opendir(my $dh, $dirname) or die "Not a directory";
    return scalar(grep { $_ ne "." && $_ ne ".." } readdir($dh)) == 0;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

if (is_folder_empty($your_dir)) {
    ....
}
Run Code Online (Sandbox Code Playgroud)

  • @Zaid:你似乎混淆了'清晰'和'简洁'.另外,`touch dir/....`愚弄你的正则表达式. (5认同)
  • re"不是目录":或者不存在或者没有权限等等`或者死"$ dirname:$!" (4认同)
  • 目录句柄不应该关闭吗?`closedir($ DH)` (3认同)
  • 清晰和简洁是好的。该解决方案确实读取了目录中的所有文件名,而最多需要三个条目(“.”和“..”可能首先出现,下一个名称表明该目录不为空。但修复此问题会破坏清晰度。 (2认同)
  • 一旦“$dh”超出范围,即“is_folder_empty”返回时,@Andre perl 将关闭文件句柄。 (2认同)

Sin*_*nür 5

如果grep { ! /^[.][.]?\z/ } readdir $dir_h多次执行检查并且某些目录可能包含许多文件,则使用可能会对性能造成问题.

最好短路除了...找到目录条目的时刻.

在带有ActiveState perl5.10.1的Windows XP上,以下子类似乎是grep$HOME的100条目的方法的两倍:

sub is_dir_empty {
    my ($dir) = @_;

    opendir my $h, $dir
        or die "Cannot open directory: '$dir': $!";

    while ( defined (my $entry = readdir $h) ) {
        return unless $entry =~ /^[.][.]?\z/;
    }

    return 1;
}
Run Code Online (Sandbox Code Playgroud)