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我将过滤器添加到递归列表文件
,但结果是一样的-(@Tedname
是一个字符串,没有isDirectory
方法。传递到accept
的文件始终是一个目录,因此该条件将始终为真。需要的是检查dir+name以查看它是否是一个目录。我更新了答案,但现在我看到了所有文件,不管它们以什么结尾th.zip
@philippe您还需要为递归的列表文件应用过滤器。@DaveNewton我将过滤器添加到递归的列表文件中,但结果是一样的。:-(@Tedname
是一个字符串,没有isDirectory
方法。传递到accept
的文件始终是一个目录,因此该条件将始终为真。需要的是检查dir+name是否是一个目录。我更新了我的问题,但我看到了所有文件,不管它们以什么结尾.zip
。我更新了我的问题,但我看到了所有文件,不管它们以.zip
结尾。
if( name != null &&(name.isDirectory()||
name.toLowerCase().endsWith(".zip")))