FilenameFilter未筛选zip文件-Java

FilenameFilter未筛选zip文件-Java,java,Java,我正在实现一个ZipComparison文件,它遍历一个目录树结构,并处理该目录树结构中所有.zip文件的MD5 import java.io.*; public class ZipComparison { public class ZipFilenameFilter implements FilenameFilter { public boolean accept(File dir, String name) { if( name != null &&am

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

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过滤器的情况下执行程序时,它工作得很好。但是,当我将
过滤器添加到

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

什么也没印出来。我遗漏了什么吗?

您是在错误地搜索递归但经过筛选的目录。 试一试


您是递归搜索,但错误地筛选了dir。 试一试


过滤后的
listFiles
调用将只列出zip文件。它将排除子目录,因此您将只看到直接位于根目录中的zip文件,而不是位于树下较深的zip文件。您可能需要一个
FileFilter
,它接受所有目录,以及名称以
.zip
结尾的任何非目录。您的筛选
listFiles
调用将只列出zip文件。它将排除子目录,因此您将只看到直接位于根目录中的zip文件,而不是位于树下较深的zip文件。您可能需要一个
FileFilter
,它接受所有目录,以及名称以
.zip

结尾的任何非目录,主要有两个问题:

  • 过滤器需要检查当前路径(dir+文件)是否为目录,以及
  • zip过滤器也需要应用于递归函数中,而不仅仅是第一个
  • 过滤器:

    公共布尔接受(文件目录,字符串名称){
    if(name==null){
    返回false;
    }
    返回新文件(dir,name).isDirectory()| | name.toLowerCase().endsWith(“.zip”);
    }
    
    递归函数(假定类变量为zip筛选器):

    公共void显示文件(文件[]文件){
    用于(文件:文件){
    if(file.isDirectory()){
    System.out.println(“目录:“+file.getName());
    showFiles(file.listFiles(zipFilenameFilter));
    }否则{
    System.out.println(“文件:“+File.getName());
    }
    }
    }
    
    两个主要问题:

  • 过滤器需要检查当前路径(dir+文件)是否为目录,以及
  • zip过滤器也需要应用于递归函数中,而不仅仅是第一个
  • 过滤器:

    公共布尔接受(文件目录,字符串名称){
    if(name==null){
    返回false;
    }
    返回新文件(dir,name).isDirectory()| | name.toLowerCase().endsWith(“.zip”);
    }
    
    递归函数(假定类变量为zip筛选器):

    公共void显示文件(文件[]文件){
    用于(文件:文件){
    if(file.isDirectory()){
    System.out.println(“目录:“+file.getName());
    showFiles(file.listFiles(zipFilenameFilter));
    }否则{
    System.out.println(“文件:“+File.getName());
    }
    }
    }
    

    它似乎正在测试以.zip结尾的目录名?@TylerHeiks我已经更新了我的问题,请看一看。@philippe请编辑代码,使其正确;实际上,您有一个空类和一个类中的类。@DaveNewton我已经用我的最新代码更新了。我做错了什么?有几件事。首先,您需要递归调用的过滤器,而不仅仅是第一个。其次,传递给过滤器的
    dir
    将始终是dir,因为它是dir。答案不是这么说的。虽然答案也是错误的,因为您不能在字符串上调用
    isDirectory
    。看起来它正在测试以.zip结尾的目录名?@TylerHeiks我已经更新了我的问题,请看一看。@philippe请编辑代码,使其正确;实际上,您有一个空类和一个类中的类。@DaveNewton我已经用我的最新代码更新了。我做错了什么?有几件事。首先,您需要递归调用的过滤器,而不仅仅是第一个。其次,传递给过滤器的
    dir
    将始终是dir,因为它是dir。答案不是这么说的。虽然答案也是错误的,因为你不能用字符串调用
    isDirectory
    。我更新了答案,但现在我看到了所有的文件,不管它们以
    结尾。zip
    @philippe你也需要为递归
    列表文件
    应用过滤器。@DaveNewton我将过滤器添加到递归
    列表文件
    ,但结果是一样的-(@Ted
    name
    是一个字符串,没有
    isDirectory
    方法。传递到
    accept
    文件始终是一个目录,因此该条件将始终为真。需要的是检查dir+name以查看它是否是一个目录。我更新了答案,但现在我看到了所有文件,不管它们以什么结尾th
    .zip
    @philippe您还需要为递归的
    列表文件应用过滤器。@DaveNewton我将过滤器添加到递归的
    列表文件中,但结果是一样的。:-(@Ted
    name
    是一个字符串,没有
    isDirectory
    方法。传递到
    accept
    文件始终是一个目录,因此该条件将始终为真。需要的是检查dir+name是否是一个目录。我更新了我的问题,但我看到了所有文件,不管它们以什么结尾
    .zip
    。我更新了我的问题,但我看到了所有文件,不管它们以
    .zip
    结尾。
    if( name != null &&(name.isDirectory()||
                    name.toLowerCase().endsWith(".zip")))