2012-05-21 66 views
3

我想讓我的程序打印我的計算機上的所有文件的巨大列表。我的問題是,它只打印第一個硬盤驅動器的第一個文件夾中的文件,當我要它打印位於我的計算機上的所有文件時。任何想法我在這裏做錯了什麼?謝謝。遍歷Java中的所有文件

這裏是代碼我使用:

主營:

import java.io.File; 
import java.util.ArrayList; 
import java.util.Arrays; 

public class Main { 

    public static void main(String[] args) { 
     ArrayList<File> roots = new ArrayList(); 
     roots.addAll(Arrays.asList(File.listRoots())); 


     for (File file : roots) { 
      new Searcher(file.toString().replace('\\', '/')).search(); 
     } 
    } 
} 

和搜索器類:

import java.io.File; 

public class Searcher { 

    private String root; 

    public Searcher(String root) { 
     this.root = root; 
    } 

    public void search() { 
     System.out.println(root); 
     File folder = new File(root); 
     File[] listOfFiles = folder.listFiles(); 
     for (File file : listOfFiles) { 
      String path = file.getPath().replace('\\', '/'); 
      System.out.println(path); 
      if (!path.contains(".")) { 
       new Searcher(path + "/").search(); 
      } 
     } 
    } 
} 
+0

雖然有重複的問題(http://stackoverflow.com/questions/3154488/best-way -to-iterate-through-a-directory-in-java and http://stackoverflow.com/questions/4917326/how-to-iterate-over-the-files-of-a-certain-directory-in-java ),一些答案是包括Java 7,而其他的則不可用rs已發佈。 – rajah9

回答

6

我只是嘗試這樣做,它爲我工作。我也有添加一個null檢查,雖然改變了目錄,評估方法:

package test; 

import java.io.File; 
import java.util.ArrayList; 
import java.util.Arrays; 

public class Searcher { 
    public static void main(String[] args) { 
     ArrayList<File> roots = new ArrayList<File>(); 
     roots.addAll(Arrays.asList(File.listRoots())); 


     for (File file : roots) { 
      new Searcher(file.toString().replace('\\', '/')).search(); 
     } 
    } 

    private String root; 

    public Searcher(String root) { 
     this.root = root; 
    } 

    public void search() { 
     System.out.println(root); 
     File folder = new File(root); 
     File[] listOfFiles = folder.listFiles(); 
     if(listOfFiles == null) return; // Added condition check 
     for (File file : listOfFiles) { 
      String path = file.getPath().replace('\\', '/'); 
      System.out.println(path); 
      if (file.isDirectory()) { 
       new Searcher(path + "/").search(); 
      } 
     } 
    } 
} 
+0

工作很好,謝謝! –

2

您應該更新您的搜索方法是這樣的:

public void search() { 
     System.out.println(root); 
     File folder = new File(root); 
     File[] listOfFiles = folder.listFiles(); 
     for (File file : listOfFiles) { 
      String path = file.getPath().replace('\\', '/'); 
      System.out.println(path); 
      if (file.isDirectory()) { 
       new Searcher(path + "/").search(); 
      } 
     } 
    } 
1

如果Java 7的是一個選項,看看到walkFileTree() method 。它將允許您訪問樹中的所有文件和目錄,您可以從驅動器的根目錄開始。只需實施基本的FileVisitor即可處理每個Path的文件屬性。你可以開始here

+0

你可能想要更新你的第一個超鏈接...在Files頁面上沒有walkFileTree()方法。並感謝您提供這個Java 7選項。 – rajah9

0

我不知道你做了什麼錯誤,但我得到一個NPE,因爲你沒有檢查下一行後的空值。

File[] listOfFiles = folder.listFiles(); 

按如下方式更改代碼後,它似乎運行良好,我停止它,因爲我有很多文件。我假設第一根之後,它會去到下一個根目錄(C:/在我的情況)

import java.io.File; 

進口的java.util.ArrayList; import java.util.Arrays;

公共類搜索{

public static void main(String[] args) { 
     ArrayList<File> roots = new ArrayList(); 
     roots.addAll(Arrays.asList(File.listRoots())); 


     for (File file : roots) { 
      System.out.println(file.toString()); 
      new Searcher(file.toString().replace('\\', '/')).search(); 
     } 
    } 
} 

類搜索器{

private String root; 

public Searcher(String root) { 
    this.root = root; 
} 

public void search() { 
    System.out.println(root); 
    File folder = new File(root); 
    File[] listOfFiles = folder.listFiles(); 
    if(listOfFiles!=null) 
    { 
    for (File file : listOfFiles) { 
     String path = file.getPath().replace('\\', '/'); 
     System.out.println(path); 
     if (!path.contains(".")) { 
      new Searcher(path + "/").search(); 
     } 
    } 
    } 
} 

}