2013-06-11 18 views
6

Zapakowuję zawartość katalogu, ale napotkam błąd podczas próby otwarcia skompresowanych plików.Zip Java tworzy "uszkodzone" pliki zip

Czy ktoś może powiedzieć, co się dzieje z moim kodem? Być może nie przydzielam wystarczającej liczby bajtów?

Zajrzyj do katalogu zipDirectory(), a zobaczysz, że pakuję foldery zawierające specjalne pliki rozszerzeń.

Nie wiesz, gdzie występuje błąd, więc może ktoś może mi pomóc!

Cenione

private void zipDirectory() { 

     File lazyDirectory = new File(defaultSaveLocation); 

     File[] files = lazyDirectory.listFiles(); 

     for (File file : files) { 

      if (file.isDirectory()) { 
      System.out.println("Zipping up " + file); 
      zipContents(file); 
      } 
     }  
    } 


public static void addToZip(String fileName, ZipOutputStream zos) throws FileNotFoundException, IOException { 

    System.out.println("Writing '" + fileName + "' to zip file"); 

    File file = new File(fileName); 
    FileInputStream fis = new FileInputStream(file); 
    ZipEntry zipEntry = new ZipEntry(fileName); 
    zos.putNextEntry(zipEntry); 

    byte[] bytes = new byte[1024]; 
    int length; 
    while ((length = fis.read(bytes)) >= 0) { 
     zos.write(bytes, 0, length); 
    } 

    zos.closeEntry(); 
    fis.close(); 

    } 

public static void zipContents(File dirToZip) { 

    List<File> fileList = new ArrayList<File>(); 

    File[] filesToZip = dirToZip.listFiles(); 

    for (File zipThis : filesToZip) { 

     String ext = ""; 

     int i = zipThis.toString().lastIndexOf('.'); 

     if (i > 0) { 
      ext = zipThis.toString().substring(i+1); 
     } 

     if(ext.matches("cpp|bem|gz|h|hpp|pl|pln|ppcout|vec|xml|csv")){ 
      fileList.add(zipThis); 
     } 

    } 


    try { 
     FileOutputStream fos = new FileOutputStream(dirToZip.getName() + ".zip"); 
     ZipOutputStream zos = new ZipOutputStream(fos); 

     for (File file : fileList) { 

      addToZip(file.toString(), zos); 

     } 

     } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     } catch (IOException e) { 
     e.printStackTrace(); 
    } 

enter image description here

+2

Nie należy wykonywać zos.close() po ostatnim dla? – Piovezan

+1

Byłbym także martwi się o to: 'file.toString()'. To znaczy, dodaj plik "C: \ some \ dir \ some \ where \ file.ext" do pliku zip, używając tej ścieżki. Oznacza to, że po jej rozpakowaniu zostanie on rozpakowany do tej DOKŁADNEJ lokalizacji. Lepiej spróbować zbudować ścieżkę względną w oparciu o oryginalną ścieżkę najwyższego poziomu (tj. Przycięcie głównego rodzica;)) – MadProgrammer

+0

Nigdy nie udało mi się uzyskać tego działającego ze standardowymi narzędziami java. Upuszczenie w Apache Commons Kompresowanie (i dodanie niektórych wywołań archiwalnych) rozwiązało to dla mnie. Upewnij się także, że zawijasz swoje strumienie wejściowe/wyjściowe w buforowanych czytnikach/programach piszących. – Amalgovinus

Odpowiedz

14

Podobnie jak większość problemów ze strumieni IO w Javie, twoja wina jest prawie na pewno, że nie zamykając strumienie poprawnie. Musisz dodać:

zos.finish(); // good practice 
zos.close(); 

po pętli for.

+0

może masz na myśli 'flush'. W każdym razie głosuję za komentarzem Pioevezana. – SJuan76

+2

Nie, mam na myśli "zakończyć()". W przypadku ZipOutputStream, finish() różni się od opróżniania(). – rolfl

+0

ok Widzę teraz, dzięki. – SJuan76

0

Dla mnie poprawka jest, że trzeba to zrobić dla każdego wpisu plik

zos.finish() 
zos.flush() 
zos.closeEntry() 

następnie wykonaj powyższe rzeczy ponownie, aby zamknąć zos. W przeciwnym razie domyślne okna nie mogą poprawnie otworzyć folderu zip, ale aplikacja innej firmy działa.

0

To może się zdarzyć, jeśli używasz znaków zorientowanych pisarza (np FileWriter), aby utworzyć rozpakowane pliki (które faktycznie zawierają dane binarne)

byłem w stanie odczytać pliki byłem ekstrakcji i przejście na binarny strumień wyjściowy (FileOutputStream) naprawiono problem

Powiązane problemy