2012-10-16 50 views
0

我必須搜索可以在任何目錄或驅動器中的文件。它應該與任何操作系統兼容。當我谷歌搜索時,大部分代碼遍歷一個特定的目錄,但不是完整的文件系統。有什麼辦法可以有效地做到這一點嗎?任何幫助或建議將非常感激。Java遍歷所有目錄並找到文件

下面的代碼,我從http://www.mkyong.com/java/how-to-traverse-a-directory-structure-in-java/得到,但我們必須通過一些目錄作爲參數。有沒有辦法推廣到所有的位置?

public static void main (String args[]) { 

    displayIt(new File("C:\\")); 
} 

public static void displayIt(File node){ 

    System.out.println(node.getAbsoluteFile()); 

    if(node.isDirectory()){ 
     String[] subNote = node.list(); 
     for(String filename : subNote){ 
      displayIt(new File(node, filename)); 
     } 
} 
+0

你可以在這些例子中改變起始目錄。遞歸總是有一個起點(所謂的根節點)。 – jondinham

回答

3

對於這種操作,Apache Commons-IO是一個很好的API。對於Unix系統,你可以只使用根「/」,然而這不會爲Windows做的,因此你將要問的所有根,在它們之間迭代:

File[] roots = File.listRoots(); 

Collection<File> files = new ArrayList<File>();  

for(File root : roots) { 
    files.addAll(FileUtils.listFiles(
     root, 
     new RegexFileFilter(<your regex filter>), 
     DirectoryFileFilter.DIRECTORY 
    )); 
} 
1

這種類型的代碼片斷會列出所有文件在一個目錄和子目錄中。您不必將任何文件添加到allFiles,您可以在那裏進行檢查。當你還沒有提供任何代碼,但(所以我想你還沒有嘗試過的任何東西),我會讓你對其進行更新)

private void addFiles(File file, Collection<File> allFiles) { 
    File[] files = file.listFiles(); 
    if (files != null) { 
     for (File f : files) { 
      allFiles.add(f); 
      addFiles(f, allFiles); 
     } 
    } 
} 
+0

這個想法很清楚,我會建議一樣的,但似乎在代碼中有一個錯誤:方法參數似乎沒有被使用:它總是遍歷根文件夾(s)。 – Wizart

0

如果要通過遞歸做到這一點,這裏是DFS代碼,代碼可能不工作(我從來沒有測試過),並沒有優化,但它可能會給你一些想法如何解決你的問題

File find(String directoryName, String pattern) 
{ 
File currentDirectory = loadFile(directoryName); 

for (String name: currentDirectory .list()) 
{ 
File children = loadFile(name) 

if (children.isDirectory()) 
{ 
File file = find(name, pattern) 
if (file !=null) 
{ 
    return file; 
} 
} 
else 
{ 
if (match(name,pattern) 
    { 
    return children; 
    } 
} 
} 
return null; 

} 
相關問題