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

あなたは再帰的に検索していますが、誤ってdirをフィルタリングしています。試す

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

フィルタリングされたlistFiles通話には、 zipファイルのみが一覧表示されます。サブディレクトリは除外されるため、ツリーのより深い位置にあるものではなく、ルート内に直接あるzipファイルのみが表示されます。おそらく、FileFilterすべてのディレクトリに加えて、名前が。で終わる非ディレクトリを受け入れるaが必要です.zip

于 2012-08-17T15:22:44.120 に答える
1

2つの主な問題:

  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 に答える