0

我正在实现一个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 );

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

4

3 回答 3

3

您正在搜索递归但错误地过滤了目录。尝试

if( name != null &&(name.isDirectory()||
                name.toLowerCase().endsWith(".zip"))) 
于 2012-08-17T15:20:31.793 回答
2

您过滤后的listFiles呼叫将列出zip 文件。它将排除子目录,因此您只会看到直接位于根目录中的 zip 文件,而不是那些位于树更深处的文件。您可能想要一个FileFilter接受所有目录以及名称以.zip.

于 2012-08-17T15:22:44.120 回答
1

两个主要问题:

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

筛选:

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());
        }
    }
}
于 2012-08-17T15:53:32.290 回答