FilenameFilter不过滤zip文件 - Java

时间:2012-08-17 15:12:08

标签: java

我正在实现一个ZipComparison文件,该文件遍历目录树结构,并处理该目录树结构中所有MD5个文件的.zip

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 );

什么都没打印出来。我错过了什么吗?

3 个答案:

答案 0 :(得分:3)

你是搜索递归但是错误地过滤了dir。 尝试

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

答案 1 :(得分:2)

您过滤的listFiles来电将仅列出 个zip文件。它将排除子目录,因此您只能看到直接位于根目录内的zip文件,而不是那些位于树下深处的zip文件。您可能希望FileFilter接受所有目录,以及任何名称以.zip结尾的非目录。

答案 2 :(得分:1)

两个主要问题:

  1. 过滤器需要检查当前路径(目录 + 文件)是否为目录,
  2. zip过滤器也需要在递归函数中应用,而不仅仅是第一个。
  3. 过滤器:

    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());
            }
        }
    }