2012-08-17 27 views
0

我正在實現一個ZipComparison文件,該文件遍歷目錄樹結構,並處理該目錄樹結構中所有.zip文件的MD5FilenameFilter不過濾zip文件 - Java

import java.io.*; 

public class ZipComparison { 

public class ZipFilenameFilter implements FilenameFilter { 

    public boolean accept(File dir, String name) { 
     if(name != null && 
       (dir.isDirectory() || name.toLowerCase().endsWith(".zip"))) { 
      return true; 
     } 
     return false; 
    } 
} 
/** 
* These two constant values are the root for the directory 
*/ 
private static final String root_a = "D:/UDU/r/tc10.0.0.2012080100_A"; 
private static final String root_b = "D:/UDU/r/tc10.0.0.2012080100_B"; 
private ZipFilenameFilter filter; 

public ZipComparison() { 
    this.filter = new ZipFilenameFilter(); 
} 

public void matchMD5() { 
    try{ 
     File root = new File(ZipComparison.root_a); 
     if(!root.exists()){ 
      System.out.println("root doesn't exist"); 
     } 
     else if(!root.isDirectory()) { 
      System.out.println("root isn't a directory"); 
     } 
     else{ 

      File[] files = new File(ZipComparison.root_a).listFiles(this.filter); 

      if(files != null){ 
       showFiles(files); 
      } 
      else{ 
       System.out.println("List of files was null."); 
       System.exit(-1); 
      } 
     } 
    } 
    catch(SecurityException ex){ 
     ex.printStackTrace(); 
    } 
} 

/** 
* iterates over the directory tree structure. 
* @param files 
*/ 
public void showFiles(File[] files){ 
    for(File file : files){ 
     if(file.isDirectory()) { 
      System.out.println("Directory: " + file.getName()); 
      showFiles(file.listFiles(this.filter)); 
     } 
     else { 
      System.out.println("File: " + file.getName()); 
     } 
    } 
} 
/** 
* @param args 
*/ 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    ZipComparison zc = new ZipComparison(); 
    zc.matchMD5(); 

    System.exit(0); 
} 

}

當我沒有ZipFilenameFilter filter執行程序它工作得很好。然而,當我加入filter

File[] files = new File(ZipComparison.root_a).listFiles(filter); 

什麼是越來越打印出來。我錯過了什麼嗎?

+0

看起來,它正在測試的目錄名結束與.zip文件? – 2012-08-17 15:19:38

+0

@TylerHeiks我已經更新了我的問題,請看看。 – cybertextron 2012-08-17 15:31:53

+0

@philippe請編輯代碼,以便它正確;因爲它有一個空的班級和一個班級。 – 2012-08-17 15:34:21

回答

1

兩個主要問題:

  1. 過濾器需要檢查,看看當前路徑(DIR +文件)是一個目錄,
  2. 拉鍊過濾器需要在遞歸被應用功能,而不僅僅是第一個。

篩選:

public boolean accept(File dir, String name) { 
    if (name == null) { 
     return false; 
    } 

    return new File(dir, name).isDirectory() || name.toLowerCase().endsWith(".zip"); 
} 

遞歸函數(假設類變量拉鍊過濾器):

public void showFiles(File[] files) { 
    for (File file : files) { 
     if (file.isDirectory()) { 
      System.out.println("Directory: " + file.getName()); 
      showFiles(file.listFiles(zipFilenameFilter)); 
     } else { 
      System.out.println("File: " + file.getName()); 
     } 
    } 
} 
3

你是搜索遞歸,但錯誤地過濾目錄。 嘗試

if(name != null &&(name.isDirectory()|| 
       name.toLowerCase().endsWith(".zip"))) 
+0

我更新了我的答案,但現在我看到所有文件,無論它們是以'.zip'結尾的文件。 – cybertextron 2012-08-17 15:28:09

+0

@philippe您還需要爲遞歸'listFiles'應用過濾器。 – 2012-08-17 15:31:40

+0

@DaveNewton我將過濾器添加到遞歸'listFiles'中,但結果是一樣的。:-( – cybertextron 2012-08-17 15:35:17

2

你過濾listFiles的通話將列出 zip文件。它將排除子目錄,因此您只會看到直接位於根目錄中的zip文件,而不是那些位於樹之下的zip文件。您可能需要接受所有目錄的FileFilter,以及名稱以.zip結尾的非目錄。

+0

我更新了我的問題,但是我看到所有文件,無論它們以'.zip'結尾。 – cybertextron 2012-08-17 15:30:52