【问题标题】:iterating over all directories in a zip file java遍历 zip 文件 java 中的所有目录
【发布时间】:2012-06-15 19:35:44
【问题描述】:

我目前正在开发一种工具,可以让我修改 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

我原以为模型/基线/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();
        }

【问题讨论】:

    标签: java hash zip md5


    【解决方案1】:

    一旦您检查了现有文件夹是目录,那么您需要遍历目录中的每个文件并处理其中的每一个。

    例子:

    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

    【讨论】:

      【解决方案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 文件中的目录条目是完全可选的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-05
        • 1970-01-01
        • 2018-10-18
        • 1970-01-01
        • 1970-01-01
        • 2017-06-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多