2012-06-12 18 views
6

sto attualmente sviluppando uno strumento che mi permettesse di modificare l'MD5 di un file zip. La struttura di directory del file assomigliaiterazione su tutte le directory in un file zip java

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

Tuttavia, quando ho eseguito il mio codice, nessuna di queste directory sono sempre in iterazione. L'uscita mi dà:

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

mi aspettavo di qualcosa come modello/di base/somefile.xml appare in uscita, ma non è così. Qualche 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(); 
     } 

risposta

3

Una volta verificare che cartella esistente è la directory allora avete bisogno di iterativo passare attraverso ogni file nella directory ed elaborare ciascuno su di questi.

Esempio:

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

Checkout questa domanda, dettagli ben processo. Iterating inside directories in Java

+1

proprio sul denaro – cybertextron

2

Penso che il tuo codice sia perfetto. Sospetto che il tuo file zip non contenga directory. Non devono!

Per esempio, ecco un file zip che ho creato con "a/b/c/d.txt". Quando ho creato inizialmente che sono stati aggiunti al file zip directory:

$ 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 

Ma poi ho cancellato le directory dall'indice 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/ 

E ora, quando ho elencato i suoi contenuti, abbastanza sicuro, viene visualizzato solo il file. Le directory sono andati:

$ 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: quando ho scompattato questo stesso file, ha creato il// directory a/b c prima di estrarre il file d.txt, anche se l'indice zip in sé non conteneva le directory. Quindi sembra che le voci della directory nei file zip siano completamente opzionali.

Problemi correlati