Обнаружить пустую директорию с Perl
каков простой способ проверить, пуста ли папка в 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 ответов
немного многословно для ясности, но:
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)) {
....
}
используя grep { ! /^[.][.]?\z/ } readdir $dir_h
может быть проблематичным для производительности в случае, если проверка выполняется много раз, и некоторые каталоги могут иметь много файлов.
было бы лучше закоротить момент записи каталога, отличный от .
или ..
не найдено.
в Windows XP с ActiveState perl
5.10.1, следующий sub, кажется, в два раза быстрее, чем 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;
}
или без каких - либо 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", поскольку мне лично не нравится double-отрицательное имя функции и возвращаемое значение.
появилась File::List
из cpan. Это перебор здесь, но может быть удобно для немного более сложных запросов, таких как test, если каталог пуст со значением, которое он содержит только пустые каталоги (т. е. не файлы).
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" }
sub is_folder_empty {
my $dirname = shift;
my @files = File::Find::Rule->file()->name('*')->maxdepth(1)->in("$dirname");
return $#files < 0;
}
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| }
пожалуйста, прочитайте комментарии, поскольку были сделаны хорошие моменты. Несмотря на отрицательные моменты, этот ответ получил, он по-прежнему верен.