10
  opendir MYDIR, "$dir";
  my @FILES = readdir MYDIR;
  closedir MYDIR;

似乎 99.9% 的时间数组中的前两个条目总是“.” 和 ”..”。如果不正确,脚本中的后续逻辑会出现问题。我遇到了后来出现目录条目的情况。这是否表明文件系统已损坏或其他原因?opendir 返回的内容是否有已知的顺序?

4

3 回答 3

21

它始终是操作系统顺序,以未排序的原始形式呈现。

尽管 。和 .. 通常是前两个条目,这是因为它们是创建的前两个条目。如果由于某种原因,其中一个被删除(通过非自然序列,因为它通常被阻止),下一个fsck(或等效的)将修复目录以再次拥有两者。这会将其中一个名称放在列表中稍后的位置。

因此,不要只是“跳过前两个条目”。相反,明确匹配它们以拒绝它们。

于 2010-04-16T15:46:14.617 回答
8

该顺序取决于操作系统,并且没有明确定义。

它们很容易被过滤掉。

   opendir MYDIR, "$dir";
   my @FILES = grep !/^\.\.?$/, readdir MYDIR  ;
   closedir MYDIR;
于 2010-04-16T16:35:30.400 回答
6

使用File::Slurp::read_dir,默认情况下,它返回一个不包含.and的列表..

于 2010-04-16T17:31:22.923 回答