在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; }
答案 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)
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| }
请阅读评论,因为已经有了很好的观点。尽管这个答案得到了负面评价,但它仍然是正确的。