Cルーチンopendir()、readdir()、closedir()は、ディレクトリ構造をトラバースする方法を提供します。ただし、readdir()によって返される各dirent構造体は、ディレクトリサブディレクトリに再帰する必要があるDIRへのポインタのセットを取得するための便利な方法を提供していないようです。
もちろん、ファイルの名前が表示されるので、その名前をディレクトリパスに追加してstat()とopendir()を実行するか、chdir()を使用してプロセスの現在の作業ディレクトリを変更してロールすることができます。 chdir( "..")を介して戻ります。
最初のアプローチの問題は、ディレクトリパスの長さが十分に長い場合、それを含む文字列をopendir()に渡すコストが、ディレクトリを開くコストを過大評価することです。もう少し理論的であれば、複雑さが線形時間を超えて増加する可能性があると言えます(ディレクトリツリー内の(相対的な)ファイル名の合計文字数)。
また、2番目のアプローチには問題があります。各プロセスには現在の作業ディレクトリが1つあるため、マルチスレッドアプリケーションでは1つを除くすべてのスレッドをブロックする必要があります。また、現在の作業ディレクトリが単なる便宜であるかどうかもわかりません(つまり、ファイルシステムクエリの前に相対パスが追加されます)。もしそうなら、このアプローチも非効率的です。
私はこれらの機能の代替を受け入れています。では、UNIXディレクトリツリーを効率的にトラバースするにはどうすればよいでしょうか(その下にあるファイルの合計文字数の線形時間)。