Если бы Perl's Opendir всегда возвращался. и .. первый? - PullRequest
10 голосов
/ 16 апреля 2010
  opendir MYDIR, "$dir";
  my @FILES = readdir MYDIR;
  closedir MYDIR;

Похоже, что в 99,9% случаев первые две записи в массиве всегда равны «.» И «..». У более поздней логики в сценарии есть проблемы, если это не так. Я столкнулся с случаем, когда записи каталога появились позже. Это свидетельствует о том, что файловая система повреждена или что-то еще? Существует ли известный порядок возврата opendir?

Ответы [ 3 ]

21 голосов
/ 16 апреля 2010

Это всегда порядок операционной системы, представленный в несортированном виде.

Пока. и .. очень часто первые две записи, потому что они были первыми двумя созданными записями. Если по какой-либо причине один из них был удален (с помощью неестественных последовательностей, поскольку это обычно предотвращается), следующий fsck (или эквивалентный) исправит каталог, чтобы снова иметь оба. Это поместит одно из имен в более позднее место в списке.

Следовательно, не просто "пропустить первые две записи". Вместо этого сопоставьте их явно, чтобы отклонить их.

8 голосов
/ 16 апреля 2010

Порядок до ОС и явно не определен иначе.

Их достаточно легко отфильтровать.

   opendir MYDIR, "$dir";
   my @FILES = grep !/^\.\.?$/, readdir MYDIR  ;
   closedir MYDIR;
6 голосов
/ 16 апреля 2010

Использовать File :: Slurp :: read_dir , который по умолчанию возвращает список, который не включает . и ...

...