Обнаружить пустую директорию с 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;
    }

кредит 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| }

пожалуйста, прочитайте комментарии, поскольку были сделаны хорошие моменты. Несмотря на отрицательные моменты, этот ответ получил, он по-прежнему верен.