Всегда ли -s возвращает ноль для каталога в Perl? - PullRequest
1 голос
/ 07 мая 2020

Я всегда видел, как -s возвращает ноль в каталоге (в Windows), но я не знаю, могу ли я на это положиться. Это удалит только несколько символов из строки кода, но, как минималист, я хочу знать, смогу ли я избежать этого.

Изменить: например, -s всегда будет давать тот же результат как -d ? 0 : -s? По-видимому, не на Linux (см. Ответ Кьетила С.), но мне любопытно узнать о Windows.

Ответы [ 2 ]

2 голосов
/ 07 мая 2020

Такой минималист, который снял бы ремни безопасности в машине или снял бы спасательный плот на яхте? ㋛

В Linux -s $dirname всегда кажется, что возвращает не менее 4096, даже если каталог пуст. В файловой системе я все равно использую. Чтобы проверить, является ли что-то каталогом, используйте -d $dirname.

1 голос
/ 07 мая 2020

-s не всегда возвращает ноль для каталогов. Он всегда может вернуть ноль на Windows, но я не знаю такой гарантии. Возможно, что -s ведет себя по-разному в разных Windows системах или для разных файловых систем. И вполне возможно, что он может вести себя по-разному в разных версиях Perl.

И почему?

defined( my $size = -s $qfn )
   or do {
      warn("Skipping $qfn: $!\n");
      next;
   };

$total_size += $size;

или

stat($qfn)
   or do {
      warn("Skipping $qfn: $!\n");
      next;
   };

$total_size += -s _;

действительно лучше, чем

stat($qfn)
   or do {
      warn("Skipping $qfn: $!\n");
      next;
   };

$total_size += -s _ if -f _;

Другими словами, действительно хорошая идея - полагаться на читателя, зная, что каталоги и любые другие типы специальных файлов могут возвращать нулевой размер файла, особенно если вы сами этого не знаете?

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