Java - 過濾目錄下的特定檔案

假設我們今天要針對某個根目錄下的各目錄內進行檔案的搜尋,此時我們可能要利用迴圈走

訪該目錄下的所有目錄,並且還要針對下一層的目錄內檢查是否有存在該特定的檔案,若有

的話則表示該目錄就是我們要的!

目錄結構如下:


以圖中的例子來說,Test1/setting是我們要的,但Test3/Test3_1/setting就不是我們要的

exclude, Test2同Test1皆存在setting

在此實作的code如下:

方法一:

  final String SEARCH_FILE = "setting";
  final String EXCLUDE_DIR = "exclude";
  final File root = new File("source/");
  
  System.out.println("1.Use java.io.FilenameFilter");
  FilenameFilter filter_file = new FilenameFilter() {
         public boolean accept(File dir, String name) {
             return name.equals(SEARCH_FILE);
         }
  };
     
  for(File file : root.listFiles()){
     if(file.isDirectory() && !file.getName().equals(EXCLUDE_DIR)){
        File[] files = file.listFiles(filter_file);
        if(files.length > 0){
           System.out.println("The setting file in "+file.getPath());
        }
     } 
  }

在走訪root目錄下時,需判斷要針對的為目錄,並且排除不走訪的目錄

在FilenameFilter的accept method過濾只針對setting的檔案

若存在的話則表示該目錄成立

方法二:

  System.out.println("2.Use Apache commons-io");
  IOFileFilter dirFilter = new AbstractFileFilter() {
      @Override
      public boolean accept(File dir, String name) {
         System.out.println(dir.getAbsolutePath());
         return root.equals(dir) && !name.equals(EXCLUDE_DIR); //$NON-NLS-1$
      }
  };
  IOFileFilter fileFilter = new NameFileFilter(SEARCH_FILE);
  @SuppressWarnings("unchecked")
  Collection results = FileUtils.listFiles(root, fileFilter, dirFilter);
  
  for(File f : results){
     System.out.println("The setting file in "+f.getParentFile());
  }

在這邊使用Apache common-io的IOFileFilter,針對dirFilter可以先篩選出要針對那些目錄

首先root.equals(dir)表示我們只針對source下的第一層目錄

再來是fileFilter是放入要搜尋的檔案(setting)

最後就是FileUtils.listFiles搜尋出來的是檔案位置本身,因此在print時是印出它的parent

PS. listFiles的第一個參數會決定接下來的dirFilter要在哪個目錄底下運作。

請注意!!

dirFilter會自動往下一層移動,也就是說當Test3符合會納入,緊接著再往下一層Test3_1進行

但是root.equals(dir)不成立 => source != source/Test3所以沒被納入dirFilter裡面

而相對地,若exclude被排除掉,則也就不會往它的內層目錄搜索(很正常啊!!XD)

也就是說當你下了個複雜條件卻發現有些內層目錄明明符合卻沒被搜索到,原因是它的上一

層可能就被排除掉了!!

再過來FileUtils.listFiles會將Test3踢除掉,因為裡面不存在setting檔案

結果輸出如下:


C:\Java program\Java io\source => exclude
C:\Java program\Java io\source => Test1
C:\Java program\Java io\source => Test2
C:\Java program\Java io\source => Test3

若您要進行深層的搜尋,可以考慮使用IOFileFilter會比較方便

留言