2012-09-19 30 views
3

是否有可能獲得文件夾(和所有子文件夾)內的文件總數而不遍歷所有文件,並且遞歸更深入?獲得結構中沒有遞歸的文件的數量

我的意思是這很容易,但也許有更好的解決方案?

private int totalFileCounter = 0; 

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

編輯:好吧,也許我的問題wasnt好問......我的意思是有從Java或文件系統或別的任何功能,可以讓我的文件在O(1)總的計數?所有的解決方案現在都有運行時O(n)。

+3

不,你不能沒有遞歸(除非你把遞歸轉換成循環,但這只是隱藏遞歸)。 –

回答

1

通常最簡單的解決方案是最好的。我不會使用一個字段來計算應該是一個函數的結果。如果該方法一次從兩個線程中調用,則可能會得到不正確的結果。

static int countFiles(File f) { 
    if (f.isDirectory()) { 
     int sum = 0; 
     for (File fi : f.listFiles()) 
      sum += countFiles(fi); 
     return sum; 
    } 
    return 1; 
} 
+0

我會接受你的代碼清潔和風格的解決方案:)謝謝! – reox

0

是的,使用Queue做一個迭代breadth-first search。下面是一個例子(未經測試):

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++; 
     } 
    } 
} 
+0

我會讓'totalFileCounter'爲局部變量。 –

+0

@PeterLawrey:我同意,但OP的方法返回類型是'void',所以我想他總是想更新實例變量'totalFileCounter'。 –

+0

在我的情況下,並不那麼重要...該方法不是被迫爲線程安全的,但它總是更好,如果它:) – reox

0

可以這Apache Commons API爲您的目的。它返回Collection<File>

+0

但我認爲它會在內部也做一種遞歸/堆棧/隊列來提供這個集合?然後它也會運行在O(n)上,並且在一些文件夾上會非常耗時... – reox