Обнаружить пустой каталог с помощью Perl - PullRequest
12 голосов
/ 20 декабря 2010

Какой простой способ проверить, пуста ли папка в 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 ]

23 голосов
/ 20 декабря 2010

Немного многословно для ясности, но:

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)) {
    ....
}
5 голосов
/ 21 декабря 2010

Использование grep { ! /^[.][.]?\z/ } readdir $dir_h может быть проблематично для производительности, если проверка выполняется много раз, а в некоторых каталогах может быть много файлов.

Было бы лучше замкнуть накоротко, как только будет найдена запись в каталоге, отличная от . или ...

В Windows XP с ActiveState perl 5.10.1 следующая подпрограмма кажется в два раза быстрее, чем 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 голосов
/ 06 октября 2015

Или без каких-либо сокращений или регулярных выражений - что исключает возможность случайного получения странных имен файлов.Плюс немного быстрее мои испытания.

#!/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, поскольку мне лично не нравятся двойное отрицательное имя функции и возвращаемое значение.

1 голос
/ 21 декабря 2010

Существует также File::List из cpan.Здесь это излишне, но может быть полезно для немного более сложных запросов, таких как проверка, если каталог пуст, то есть он содержит только пустые каталоги (т.е. не файлы).

0 голосов
/ 03 июля 2015
  sub is_folder_empty {
        my $dirname = shift;
        my @files = File::Find::Rule->file()->name('*')->maxdepth(1)->in("$dirname");
        return $#files < 0;
    }
0 голосов
/ 29 мая 2012
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" }
0 голосов
/ 20 декабря 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...