2012-08-17 3 views
0

ZipComparison 파일을 구현합니다.이 파일은 디렉토리 트리 구조를 탐색하고 해당 디렉토리 트리 구조에있는 .zip 개 파일 중 MD5 개를 처리합니다. 나는 ZipFilenameFilter filter하지 않고 프로그램을 실행하면FilenameFilter가 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); 
} 

}

는 잘 작동합니다. 그러나 filter

에 추가하면
File[] files = new File(ZipComparison.root_a).listFiles(filter); 

아무 것도 출력되지 않습니다. 내가 놓친 게 있니?

+0

것 같습니다? –

+0

@TylerHeiks 내 질문을 업데이트했습니다.보세요. – cybertextron

+0

@philippe 코드를 편집하여 올바르게 입력하십시오. 그것은 빈 클래스와 클래스 내의 클래스를 가지고 있기 때문입니다. –

답변

1

두 가지 주요 문제 : 필터는 현재 경로 (디렉토리 + 파일) 디렉토리인지 여부를 확인해야

  1. 압축 필터는 재귀 적으로 적용 할 필요가 기능뿐 아니라 첫 번째 기능도 제공합니다.

필터 :

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

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

재귀 함수 (클래스 변수 우편 필터를 가정)은 .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

+0

@philippe 재귀적인'listFiles'에도 필터를 적용해야합니다. –

+0

@DaveNewton 필터를 재귀적인'listFiles'에 추가했지만 그 결과는 같습니다.:-( – cybertextron

2

을 시도 필터링 된 listFiles 호출 zip 파일을 나열합니다. 하위 디렉토리는 제외되므로 트리 아래쪽에있는 zip 파일이 아니라 루트에 직접있는 zip 파일 만 볼 수 있습니다. 아마도 FileFilter은 모든 디렉토리와 그 이름이 .zip으로 끝나는 모든 비 디렉토리를 허용합니다.

+0

내 질문이 업데이트되었지만'.zip'으로 끝나는 지에 관계없이 모든 파일을보고 있습니다. – cybertextron

관련 문제