iterando sobre todos los directorios en un archivo zip java

Actualmente estoy desarrollando una herramienta que me permitiría modificar el md5 de un archivo zip. La estructura de directorios del archivo se parece a

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

Sin embargo, cuando ejecuto mi código, ninguno de esos directorios se itera. La salida me da:

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

Esperaba que algo como model/baseline/somefile.xml apareciera en la salida, pero no es así. ¿Alguna idea?

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();
        }

preguntado el 12 de junio de 12 a las 22:06

2 Respuestas

Una vez que verifique que la carpeta existente es un directorio, debe revisar iterativamente cada archivo en el directorio y procesar cada uno de ellos.

Ejemplo:

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);
}

Echa un vistazo a esta pregunta, detalla bien el proceso. Iterando directorios internos en Java

contestado el 23 de mayo de 17 a las 12:05

Creo que tu código es perfecto. Sospecho que su archivo zip no contiene directorios. ¡No tienen que hacerlo!

Por ejemplo, aquí hay un archivo zip que creé con "a/b/c/d.txt". Cuando lo creé inicialmente, los directorios se agregaron al archivo 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

Pero luego eliminé los directorios del índice 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/

Y ahora, cuando enumeré su contenido, efectivamente, solo aparece el archivo. Los directorios se han ido:

$ 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

Nota: cuando descomprimí este mismo archivo, creó el directorio a/b/c/ antes de extraer el archivo d.txt, aunque el índice zip en sí no contenía directorios. Entonces parece que las entradas de directorio en archivos zip son completamente opcionales.

Respondido el 12 de junio de 12 a las 22:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.