2012-11-18 143 views
2

我試圖獲取目錄中所有文本文件的名稱。如果目錄有子目錄,那麼我也想獲得這些文件。我不知道如何讓這個過程繼續任何數目的子目錄。遞歸查找目錄中的所有文本文件

現在下面的代碼只是獲取當前目錄中的所有文本文件和目錄中的子目錄。對於找到的每個子目錄,它還找到任何文本文件和更深的子目錄。問題是,如果那些更深的子目錄有更深的子目錄,那麼我沒有找到所有的文本文件。這似乎是一個需要遞歸的問題,因爲我不知道這會發生多深。

這裏是我到目前爲止的代碼:

File rootDirectory = new File(rootDir); 
if (rootDirectory.isDirectory()) { 
    System.out.println("Valid directory"); 

    File[] listOfFiles = rootDirectory.listFiles(); 
    for (int i = 0; i < listOfFiles.length; i++) { 
     String iName = listOfFiles[i].getName(); 
     if (listOfFiles[i].isFile()) { 
      if (iName.endsWith(".txt") || iName.endsWith(".TXT")) { 
       System.out.println("File: "+iName); 
      } 
     } 
     if (listOfFiles[i].isDirectory()) { 
      System.out.println("Directory: "+iName); 

      File[] subList = listOfFiles[i].listFiles(); 
      for (int j = 0; j < subList.length; j++) { 
       String jName = subList[j].getName(); 
       if (subList[j].isFile()) { 
        if (jName.endsWith(".txt") || jName.endsWith(".TXT")) { 
         System.out.println("\tFile: "+jName); 
        } 
       } 
       if (subList[j].isDirectory()) { 
        System.out.println("\tDirectory: "+jName); 
       } 
      } 
     } 
    } 
} 
else System.out.println("Invalid directory"); 

編輯:得到它的工作,謝謝奧拉夫Dietsche:

public void findFiles(File root, int depth) { 
    File[] listOfFiles = root.listFiles(); 
    for (int i = 0; i < listOfFiles.length; i++) { 
     String iName = listOfFiles[i].getName(); 
     if (listOfFiles[i].isFile()) { 
      if (iName.endsWith(".txt") || iName.endsWith(".TXT")) { 
       for (int j = 0; j < depth; j++) System.out.print("\t"); 
       System.out.println("File: "+iName); 
      } 
     } 
     else if (listOfFiles[i].isDirectory()) { 
      for (int j = 0; j < depth; j++) System.out.print("\t"); 
      System.out.println("Directory: "+iName); 
      findFiles(listOfFiles[i], depth+1); 
     } 
    } 
} 

回答

8

這是一個recursive problem

public void find_files(File root) 
{ 
    File[] files = root.listFiles(); 
    for (File file : files) { 
     if (file.isFile()) { 
      ... 
     } else if (file.isDirectory()) { 
      find_files(file); 
     } 
    } 
} 
+0

簡短而親切。 +1 –

+0

謝謝,我認爲這是我需要的。我會嘗試一下 – asimes

1

答案就在你的問題的標籤。使用遞歸。遞歸包含自己的方法調用。

在這種情況下,該方法應直接在給定目錄下打印所有文本文件,併爲目錄的每個子目錄調用自身。

2

使用Java 7中,我實現similiar FUNC的java.nio.file capabilites。並增加了一些測試。

基準我的電腦

  "c:/" "c:/windows" 
file.io 36272ms  14082ms 
file.nio 7167ms  2987ms 

更多的Javadoc中上搜索.TXT時,這是相當強大的API

java.nio.file.filevisitor javadoc

public static void main(String[] args) { 
    long starttime = System.currentTimeMillis(); 
    try { 
     Path startPath = Paths.get("c:/"); 
     Files.walkFileTree(startPath, new SimpleFileVisitor<Path>() { 
      @Override 
      public FileVisitResult preVisitDirectory(Path dir, 
        BasicFileAttributes attrs) { 
       System.out.println("Dir: " + dir.toString()); 
       return FileVisitResult.CONTINUE; 
      } 

      @Override 
      public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) { 
       if (file.toString().endsWith(".txt")){ 
        System.out.println(file.toString());  
       } 
       return FileVisitResult.CONTINUE; 
      } 

      @Override 
      public FileVisitResult visitFileFailed(Path file, IOException e) { 
       return FileVisitResult.CONTINUE; 
      } 
     }); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    long completetime = System.currentTimeMillis() - starttime; 
    System.out.println("totaltime=" + completetime); 

} 
+0

我收到了,並在這行代碼錯誤。 BasicFileAttributes attrs它表示BasicFileAttributes無法解析爲類型。任何想法如何解決它? – chriss

+0

這應該是一個導入問題,檢查你有進口的地方,你實際上使用java7或更高版本 –

相關問題