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

99.9% の確率で、配列の最初の 2 つのエントリは常に「.」のようです。と ".."。true でない場合、スクリプトの後半のロジックに問題があります。ディレクトリエントリが後で表示されるケースに遭遇しました。これは、ファイル システムが破損していることを示していますか? opendirが返すものの既知の順序はありますか?

4

3 に答える 3

21

これは常にオペレーティング システムの順序であり、ソートされていない未加工の状態で表示されます。

その間 。と .. が最初の 2 つのエントリであることがよくあります。これは、作成された最初の 2 つのエントリであるためです。何らかの理由でそれらの1つが削除された場合(通常は防止されているため、不自然なシーケンスを介して)、次のfsck(または同等の)ディレクトリが修正され、両方が再び存在するようになります。これにより、名前の 1 つがリストの後の場所に配置されます。

したがって、「最初の 2 つのエントリをスキップする」だけではいけません。代わりに、それらを明示的に一致させて拒否します。

于 2010-04-16T15:46:14.617 に答える
8

順序は OS に依存し、明示的に定義されていません。

それらは簡単に除外できます。

   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 に答える