3

すべてのファイルを反復処理せずに、フォルダー(およびすべてのsub *フォルダー)内のファイルの総数を取得し、再帰的に深くすることは可能ですか?

これは確かに非常に簡単ですが、もっと良い解決策があるのではないでしょうか。

private int totalFileCounter = 0;

private void countFiles(File f) {
    if (f.isDirectory()) {
        for (File fi : f.listFiles()) {
            countFiles(fi);
        }
    } else {
        totalFileCounter++;
    }
}

編集:さて、私の質問はそれほど良い質問ではなかったかもしれません...つまり、Javaやファイルシステムなど、O(1)のファイルの総数を取得できる機能はありますか?すべてのソリューションには、ランタイムO(n)があります。

4

3 に答える 3

1

一般的に、最も単純なソリューションが最適です。関数であるべきものの結果を計算するためにフィールドを使用することはありません。メソッドが一度に2つのスレッドから呼び出された場合、誤った結果が得られる可能性があります。

static int countFiles(File f) {
    if (f.isDirectory()) {
        int sum = 0;
        for (File fi : f.listFiles()) 
            sum += countFiles(fi);
        return sum;
    }
    return 1;
}
于 2012-09-19T10:45:23.027 に答える
0

はい、を使用して幅優先探索をQueue繰り返し実行します。次に例を示します(テストされていません)。

private void countFiles(File f) {
    Queue<File> queue = new LinkedList<File>();
    queue.add(f);
    while (!queue.isEmpty()) {
      File file = queue.poll();
      if (file.isDirectory()) {
        queue.addAll(Arrays.asList(file.listFiles()));
      } else {
        totalFileCounter++;
      }
    }
}
于 2012-09-19T10:43:43.407 に答える
0

このApacheCommonsAPIはあなたの目的を果たすことができますか?を返しますCollection<File>

于 2012-09-19T10:50:11.977 に答える