2012-01-23 7 views
44

opendir/readdirを使用して、Linuxのようなシステム上でファイルのリストを取得しています。ディレクトリエントリは、ファイル名のアルファベット順に返されます。しかし、この注文については、マニュアルページに何も表示されていません。readdir()は注文を保証しますか?

readdir guarranteesに注文があるかどうかは誰にでも分かりますか?

+0

経験則として、ドキュメントに記載されていない場合は、答えは「いいえ」です。すべての実装で一貫した注文があったとしても、それが文書化されていなければ、おそらく保証されません。 –

+4

アルファベット順に表示されている場合、アルファベット順に元々作成されていることがほぼ確実です。 'unzip'や' tar'でそれらを抽出することによって... 'readdir'は順序を与えません。 –

+1

ところで、結果を注文したり、ランダムにアクセスしたりする場合は、 'scandir'が役に立ちます。これはPOSIX 2008で標準化されており、これまでの共通の拡張でした。 –

答えて

34

readdirメソッドは、発注を保証しません。アルファベット順にソートされていることを確認したい場合は、自分で行う必要があります。

注:私は、これが事実であるという明確な文書のために少し探しました。私が来た最も近いが決定的な意味が、それは、コマンドの素敵な概観を与えない、それが歴史だと一般的にトラバーサル順序どのように実装のあるなしによってイッツない次のリンク

です。

8

明示的には保証されていません。順序はしばしばいくつかの規則に従いますが、規則は複雑なので、それらに頼るべきではありません。順序は、例えば、同じディレクトリ内で起こっている他の操作の影響を受ける可能性があり、それらを制御することはできません。順序をランダムに扱い、必要に応じて自分自身を並べ替えます。

6

いいえ、readdirは発注を保証しません。

(一部のファイルシステムは、同じ順序であなたにそれらを返すことがありますreaddirのような場合には、一定の順序でディレクトリエントリを保存するかもしれないが、それはreaddir関数自体の機能ではありません。)

13

を一言で言えば、いや、 readdir()は特定の順序を保証しません。

glibc manual

でのreaddir例からのファイルがディレクトリに表示される順序は、かなり ランダムになる傾向があります。より多くの有用なプログラムは、「Linuxのプログラミング・インターフェース」からそれら

+3

リンクに失敗しました。私は[web.archive.org](https://web.archive.org/web/20120531021029/http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02)でスナップショットを見つけました。 /library_13.html)を参照してください。 – iplus26

9

を印刷する前に( それらをアルファベット順に並べによって多分)エントリをソートします:

READDIRによって返されたファイル名は()、ソートされた順序ではありませんが、ファイルがディレクトリにファイルを追加する の順序と、ファイルが削除された後にディレクトリ のリストの空白をどのように埋め込むかによって異なります)。 (これらはREADDIRによって取得されることと同じソートされていない 順序でファイルを一覧表示します-fコマンドls()。)

我々は プログラマ定義に合致するファイルのソートされたリストを取得するために、(3)関数SCANDIRを使用することができます基準。詳細については、マニュアルページを参照してください。 SUSv3では が指定されていませんが、ほとんどのUNIX実装ではscandir()が提供されています。

2

readdir()は、OSディスクの読み込み順序より上位の順序を保証しません。Solarisの - - 私はいくつかのプラットフォーム上で作られたテストによると


sun4sol、x86のゾル、Linuxの、サンプルコードとWindowsのすべての結果がランダムにdisplatedました。


ソース:他の回答に加えてreaddir() beginning with dots instead of files

#include <stdio.h> 
#include <stdlib.h> 
#include <dirent.h> 

int main() { 

    DIR *dir; 
    struct dirent *dp; 
    char * file_name; 
    char dirpath [100] ; 


    while(1==1){ 
     printf("Choose dir:"); 
     scanf("%s",dirpath); 
     dir = opendir(dirpath); 
     while ((dp=readdir(dir)) != NULL) { 
      if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..")) 
      { 
       // do nothing (straight logic) 
      } else { 
       file_name = dp->d_name; // use it 
       printf("file_name: \"%s\"\n",file_name); 
      } 
     } 
     closedir(dir); 
    } 

    return 0; 
} 
1

readdir man pageは、ファイルの順序についてかなり明確です。

readdir()を連続して呼び出してファイル名を読み取る順序は、ファイルシステムの実装によって異なります。名前がどのような方法でもソートされることはありません。

ReiserFSのようなファイルシステムの中には、ファイルを字句順に並べるものがあります。

あなたのケースでは、名前を配列に格納してから配列をソートする必要があります。

たとえば、配列をソートするにはqsort()を使用します。

関連する問題