迭代zip文件java中的所有目录

时间:2012-06-12 21:01:01

标签: java hash zip md5

我目前正在开发一种工具,允许我修改zip文件的md5。该文件的目录结构类似于

          baselines->
models -> icons    ->
          lang     ->
          (a bunch of files here)

然而,当我运行我的代码时,这些目录都没有进入迭代。输出给了我:

Name:model/visualization_dependency.xml
Name:model/visualization_template.xml
Name:model/weldmgmt_dependency.xml
Name:model/weldmgmt_template.xml

我希望输出中出现类似model / baseline / somefile.xml的内容,但事实并非如此。有什么想法吗?

byte[] digest = null;
        MessageDigest md5;

        try {
            md5 = MessageDigest.getInstance("MD5");

            ZipEntry current;
            while((current = entry.getNextEntry()) != null){

                //ZipEntry current = entry.getNextEntry();
                System.out.println("Size:" + current.getSize());
                System.out.println("Name:" + current.getName());

                if(current.isDirectory()){
                    digest = this.encodeUTF8(current.getName());
                    md5.update(digest);
                }
                else{
                    int size = (int)current.getSize();
                    digest = new byte[size];
                    entry.read(digest, 0, size);
                    md5.update(digest);
                }
            }
            digest = md5.digest();
            entry.close();
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

2 个答案:

答案 0 :(得分:3)

检查现有文件夹是目录后,您需要迭代浏览目录中的每个文件并处理其中的每个文件。

示例:

if(current.isDirectory()){
  System.out.println("Directory: " + file.getName());
  //Get list of files by file.listFiles() and pass it to 
 // to other method that will do processing. 
  digest = this.encodeUTF8(current.getName());
  md5.update(digest);
}

查看此问题,详细了解流程。 Iterating inside directories in Java

答案 1 :(得分:2)

我认为你的代码很完美。我怀疑你的zip文件不包含目录。他们没必要!

例如,这是我用“a / b / c / d.txt”创建的zip文件。当我最初创建它时,目录被添加到zip文件中:

$ unzip -l a.zip 
Archive:  a.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2012-06-12 14:22   a/
        0  2012-06-12 14:22   a/b/
        0  2012-06-12 14:22   a/b/c/
       19  2012-06-12 14:22   a/b/c/d.txt
---------                     -------
       19                     4 files

但后来我删除了zip索引中的目录:

$ zip -d a.zip  a/b/c
deleting: a/b/c/
$ zip -d a.zip  a/b
deleting: a/b/
$ zip -d a.zip  a
deleting: a/

现在当我列出其内容时,确定只显示该文件。目录消失了:

$ unzip -l a.zip 
Archive:  a.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
       19  2012-06-12 14:22   a/b/c/d.txt
---------                     -------
       19                     1 file

注意:当我解压缩同一个文件时,它在提取d.txt文件之前创建了a / b / c /目录,即使zip索引本身不包含目录。所以看起来zip文件中的目录条目是完全可选的。