Есть ли способ проверить, является ли файл пустым файлом с помощью программы PERL? - PullRequest
1 голос
/ 18 июня 2019

Я ищу небольшой скрипт, который скажет мне, является ли файл пустым файлом или нет, но я не могу отобразить это.

Я использовал следующий код:

opendir DIR,$directory ;
while (my $dir =readdir DIR) {
    if (-s "$dir") {
    print "This is an empty file";
    }
}

Здесь я не могу напечатать «Это пустой файл», и мой код не помещается в цикл if.Может кто-нибудь сказать мне, что не так в приведенном выше коде

Ответы [ 2 ]

7 голосов
/ 18 июня 2019

Соответствующие операторы проверки файлов :

  • -z: проверить, пуст ли файл.
  • -s: проверить, не имеет ли файл ненулевойsize (возвращает размер в байтах).

Вы проверяете, не является ли $dir непустым, что противоположно тому, чего вы пытаетесь достичь.Вместо этого используйте -z (или !-s).

Кроме того, каждый $dir - это просто имя файла без пути, поэтому вам нужно включить его самостоятельно, если вы не обрабатываете текущий каталог.

if (-z "$directory/$dir") {
    print "This is an empty file";
}
1 голос
/ 18 июня 2019

Ваша главная проблема в том, что readdir() не возвращает то, что вы думаете, что делает. Возвращает имена файлов в каталоге. Но к именам, которые вы возвращаете, не прикреплен путь к каталогу. И оператору -s необходим полный путь к файлу, чтобы найти его.

Так что вам нужно присоединить имя каталога самостоятельно. Примерно так будет работать:

opendir DIR, $directory ;
while (my $dir = readdir DIR) {
    # Note: Full path here.
    if (-s "$directory/$dir") {
        print "This is an empty file";
    } 
}

Но есть пара других вещей, которые я исправлю. Во-первых, -s возвращает размер файла. Так что это верно для непустого файла. Это означает, что ваша логика перевернута. Это действительно должно быть так:

if (-s "$directory/$dir") {
    print "This is a non-empty file";
} else {
    print "This is an empty file";
}

Стоит также отметить, что использование дескрипторов каталога bareword не очень хорошая идея. Гораздо лучше использовать лексические переменные в качестве дескрипторов. Я бы написал ваш код так:

opendir my $dir_h, $directory ;
while (my $file = readdir $dir_h) {
    # Note: Full path here.
    if (-s "$directory/$file") {
        print "This is a non-empty file";
    } else {
        print "This is an empty file";
    } 
}

О, я также хитро изменил имя переменной. $file кажется гораздо лучшим именем, чем $dir: -)

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