web-dev-qa-db-ja.com

readdir()は順序を保証しますか?

Opendir/readdirを使用して、Linuxのようなシステム上のファイルのリストを取得しています。ディレクトリエントリはファイル名のアルファベット順に返されるようです。ただし、この順序が保証されていることについては、manページに何も表示されません。

Readdirが注文を保証するかどうかを教えてもらえますか?

49
Tom

readdirメソッドは順序を保証しません。アルファベット順に並べ替えるには、自分で並べ替える必要があります。

注:私はこれが事実だと言って、決定的なドキュメントを少し検索しました。一番近いのは次のリンクです

これは決して決定的なものではありませんが、コマンドの概要、履歴、および実装方法が通常はトラバース順であることがわかります。

40
JaredPar

要するに、readdir()は特定の順序を保証しません。

glibcマニュアル のreaddirの例から

ディレクトリにファイルが表示される順序は、かなりランダムになる傾向があります。より有用なプログラムは、エントリを印刷する前に(おそらくアルファベット順に並べ替えて)ソートします

13

「Linuxプログラミングインターフェイス」から:

Readdir()によって返されるファイル名は、ソートされた順序ではなく、ディレクトリ内で発生する順序です(これは、ファイルシステムがディレクトリにファイルを追加する順序と、ファイル内のギャップを埋める方法によって異なりますファイルが削除された後のディレクトリリスト)。 (コマンドls –fは、readdir()によって取得されるのと同じソートされていない順序でファイルをリストします。)

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

9
efannu-723

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

8
user25148

いいえ、readdirは順序を保証しません。

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

6
nos

readdir()は、OSディスクの読み取り順序である他の順序を保証しません。


いくつかのプラットフォーム(Solaris-Sun4sol、x86 sol、linux、Windows、サンプルコード)で作成したテストによると、すべての結果はランダムにディスプレースされました。


ソース: readdir()ファイルではなくドットで始まる

#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;
}
2
Wojciech Papaj

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

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

ReiserFSのような一部のファイルシステムは、ファイルを字句順にリストします。

あなたの場合、名前を配列に保存し、配列をソートする必要があります。

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

1
Ring Ø