使用Perl检测空目录

时间:2010-12-20 20:14:28

标签: perl file directory

在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"; 
}

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


谢谢大家!我最终使用了:

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

7 个答案:

答案 0 :(得分:23)

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

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

然后你可以这样做:

if (is_folder_empty($your_dir)) {
    ....
}

答案 1 :(得分:5)

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

最好在找到...以外的目录条目时短路。

在具有ActiveState perl 5.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;
}

答案 2 :(得分:2)

或者没有任何grepping或正则表达式 - 这排除了任何奇怪的文件名偶然发生的可能性。加上我的测试速度稍快。

#!/usr/bin/perl
use strict;
use warnings;

sub is_dir_empty {
    return -1 if not -e $_[0];   # does not exist
    return -2 if not -d $_[0];   # in not a directory
    opendir my $dir, $_[0] or    # likely a permissions issue
        die "Can't opendir '".$_[0]."', because: $!\n";
    readdir $dir;
    readdir $dir;
    return 0 if( readdir $dir ); # 3rd times a charm
    return 1;
}

my @folders = qw( ./ ./empty ./hasonefile ./hastwofiles ./doesnotexist ./afile );
for my $folder ( @folders ) {
    print "Folder '$folder' ";
    my $rc = is_dir_empty( $folder );
    if( $rc == -1 ) {
        print "does not exist\n";
    } elsif( $rc == -2 ) {
        print "is not a directory\n";
    } elsif( !$rc ) {
        print "is not empty\n";
    } else {
        print "is empty\n";
    }
}

非常简单。如果您通过调用readdir获得三个有效响应,那么您知道必须有一个文件。无论文件的名称是什么 - 或者文件的处理顺序。本来不喜欢名为'is_dir_used'的东西,因为我个人不喜欢双阴性函数名和返回值。

答案 3 :(得分:1)

cpan还有File::List。这里有点矫枉过正,但对于稍微复杂的请求(如测试,如果目录为空,其含义只包含空目录(即:不是文件))可以很方便。

答案 4 :(得分:-1)

opendir(DIR,"DIR PATH") or die "Unable to open directory \"DIR PATH\" \n";
my @drList = readdir(DIR);
close(DIR);
if( grep(/\w/,@drList) ){ print "Not Empty\n" }
else { print "Empty\n" }

答案 5 :(得分:-1)

  sub is_folder_empty {
        my $dirname = shift;
        my @files = File::Find::Rule->file()->name('*')->maxdepth(1)->in("$dirname");
        return $#files < 0;
    }

答案 6 :(得分:-2)

Credit to DevShed

if (scalar <directory/*>) {print qq|File Exists\n|}

修改

要包含隐藏文件:

@arr = <directory/* directory/.*>;
@arr = grep {!/^directory/[.]{1,2}$/} @arr;
if (@arr) { print qq|File or Directory Exists\n| }

请阅读评论,因为已经有了很好的观点。尽管这个答案得到了负面评价,但它仍然是正确的。