2010-10-18 15 views
7
public static void main(String argv[]) { 
    try { 
     String date = new java.text.SimpleDateFormat("MM-dd-yyyy") 
       .format(new java.util.Date()); 
     File inFolder = new File("Output/" + date + "_4D"); 
     File outFolder = new File("Output/" + date + "_4D" + ".zip"); 
     ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(
       new FileOutputStream(outFolder))); 
     BufferedInputStream in = null; 
     byte[] data = new byte[1000]; 
     String files[] = inFolder.list(); 
     for (int i = 0; i < files.length; i++) { 
      in = new BufferedInputStream(new FileInputStream(
        inFolder.getPath() + "/" + files[i]), 1000); 
      out.putNextEntry(new ZipEntry(files[i])); 
      int count; 
      while ((count = in.read(data, 0, 1000)) != -1) { 
       out.write(data, 0, count); 
      } 
      out.closeEntry(); 
     } 
     out.flush(); 
     out.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Próbuję spakować folder zawierający podfoldery. Próbuję skompresować folder o nazwie 10-18-2010_4D. Powyższy program kończy się następującym wyjątkiem. Proszę doradzić, jak rozwiązać problem.Zwalnianie folderu zawierającego podfoldery

java.io.FileNotFoundException: Output\10-18-2010_4D\4D (Access is denied) 
    at java.io.FileInputStream.open(Native Method) 
    at java.io.FileInputStream.<init>(Unknown Source) 
    at java.io.FileInputStream.<init>(Unknown Source) 
    at ZipFile.main(ZipFile.java:17) 
+0

Nazwa folderu w wyjątku i ta, o której wspomniałeś, są różne. – ivorykoder

+0

możliwy duplikat [katalogów w pliku zip podczas używania java.util.zip.ZipOutputStream] (http://stackoverflow.com/questions/740375/directories-in-a-zip-file-when-using-java-util -zip-zipoutputstream) –

Odpowiedz

5

Trzeba sprawdzić, czy plik jest katalogiem, ponieważ nie można przechodzić do katalogów metody zip.

Spójrz na this page, który pokazuje, w jaki sposób można rekursywnie skompresować dany katalog.

+0

Myślę, że @bobbane jest poprawne. Uruchomiłem twój kod przy użyciu katalogu zawierającego tylko pliki i działało zgodnie z przeznaczeniem. Jak tylko dodałem zagnieżdżone directoyr, otrzymałem wyjątek FNF (Access is Denied). –

2

Chciałbym dołączyć ant task for zipping - łatwiej jest z nim pracować.

Klasa zadanie można znaleźć tutaj: org.apache.tools.ant.taskdefs.Zip (użyj go programowo)

+0

Czy możesz podać kilka uwag na temat, dlaczego musimy preferować zadanie ant do skompresowania? – ivorykoder

+1

odbywa się w 3 wierszach kodu i działa. Porównaj z powyższym. – Bozho

+0

@Bozho Mogę znaleźć wiele plików JAR w najnowszej wersji Ant. który z nich powinien być użyty do folderów Zipping? – LGAP

0
private void zipFiles (ArrayList listWithFiles, String zipName) { 
    try { 

     byte[] buffer = new byte[1024]; 

     // create object of FileOutputStream 
     FileOutputStream fout = new FileOutputStream(zipName); 

     // create object of ZipOutputStream from FileOutputStream 
     ZipOutputStream zout = new ZipOutputStream(fout); 

     for (String currentFile : listWithFiles) { 

      // create object of FileInputStream for source file 
      FileInputStream fin = new FileInputStream(currentFile); 

      // add files to ZIP 
      zout.putNextEntry(new ZipEntry(currentFile)); 

      // write file content 
      int length; 

      while ((length = fin.read(buffer)) > 0) { 
       zout.write(buffer, 0, length); 
      } 

      zout.closeEntry(); 

      // close the InputStream 
      fin.close(); 
     } 

     // close the ZipOutputStream 
     zout.close(); 
    } catch (IOException ioe) { 
     System.out.println("IOException :" + ioe); 
    } 
} 
+1

To nie rozwiązuje problemu podfolderów – Comencau

18

Oto kod do tworzenia archiwum ZIP. Utworzone archiwum zachowuje oryginalną strukturę katalogów (jeśli istnieje).

public static void addDirToZipArchive(ZipOutputStream zos, File fileToZip, String parrentDirectoryName) throws Exception { 
    if (fileToZip == null || !fileToZip.exists()) { 
     return; 
    } 

    String zipEntryName = fileToZip.getName(); 
    if (parrentDirectoryName!=null && !parrentDirectoryName.isEmpty()) { 
     zipEntryName = parrentDirectoryName + "/" + fileToZip.getName(); 
    } 

    if (fileToZip.isDirectory()) { 
     System.out.println("+" + zipEntryName); 
     for (File file : fileToZip.listFiles()) { 
      addDirToZipArchive(zos, file, zipEntryName); 
     } 
    } else { 
     System.out.println(" " + zipEntryName); 
     byte[] buffer = new byte[1024]; 
     FileInputStream fis = new FileInputStream(fileToZip); 
     zos.putNextEntry(new ZipEntry(zipEntryName)); 
     int length; 
     while ((length = fis.read(buffer)) > 0) { 
      zos.write(buffer, 0, length); 
     } 
     zos.closeEntry(); 
     fis.close(); 
    } 
} 

Nie zapomnij zamknąć strumieni wyjściowych po wywołaniu tej metody. Oto przykład:

public static void main(String[] args) throws Exception { 
    FileOutputStream fos = new FileOutputStream("C:\\Users\\vebrpav\\archive.zip"); 
    ZipOutputStream zos = new ZipOutputStream(fos); 
    addDirToZipArchive(zos, new File("C:\\Users\\vebrpav\\Downloads\\"), null); 
    zos.flush(); 
    fos.flush(); 
    zos.close(); 
    fos.close(); 
} 
0

Oto, co napisałem. W tym przykładzie zachowywana jest struktura plików, przez co należy unikać wyjątku wyjątków dotyczących duplikatów.

/** 
    * Compress a directory to ZIP file including subdirectories 
    * @param directoryToCompress directory to zip 
    * @param outputDirectory  where to place the compress file 
    */ 
    public void zipDirectory(File directoryToCompress, File outputDirectory){ 
     try { 
      FileOutputStream dest = new FileOutputStream(new File(outputDirectory, directoryToCompress.getName() + ".zip")); 
      ZipOutputStream zipOutputStream = new ZipOutputStream(dest); 

      zipDirectoryHelper(directoryToCompress, directoryToCompress, zipOutputStream); 
      zipOutputStream.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
    } 

    private void zipDirectoryHelper(File rootDirectory, File currentDirectory, ZipOutputStream out) throws Exception { 
     byte[] data = new byte[2048]; 

     File[] files = currentDirectory.listFiles(); 
     if (files == null) { 
      // no files were found or this is not a directory 

     } else { 
      for (File file : files) { 
       if (file.isDirectory()) { 
        zipDirectoryHelper(rootDirectory, file, out); 
       } else { 
        FileInputStream fi = new FileInputStream(file); 
        // creating structure and avoiding duplicate file names 
        String name = file.getAbsolutePath().replace(rootDirectory.getAbsolutePath(), ""); 

        ZipEntry entry = new ZipEntry(name); 
        out.putNextEntry(entry); 
        int count; 
        BufferedInputStream origin = new BufferedInputStream(fi,2048); 
        while ((count = origin.read(data, 0 , 2048)) != -1){ 
         out.write(data, 0, count); 
        } 
        origin.close(); 
       } 
      } 
     } 

    } 
Powiązane problemy