2012-04-11 14 views
1

Ich versuche, einige Dateien zu einer ZIP-Datei hinzuzufügen, erstellt die Datei, fügt jedoch nichts hinzu. Code 1:Hinzufügen von Dateien zu ZIP-Datei

String fulldate = year + "-" + month + "-" + day + "-" + min; 

File dateFolder = new File("F:\\" + compname + "\\" + fulldate); 
dateFolder.mkdir(); 

String zipName = "F:\\" + compname + "\\" + fulldate + "\\" + fulldate + ".zip"; 

zipFolder(tobackup, zipName); 

Meine Funktion:

public static void zipFolder(File folder, String name) throws Exception { 
    byte[] buffer = new byte[18024]; 

    ZipOutputStream out = new ZipOutputStream(new FileOutputStream(name)); 
    FileInputStream in = new FileInputStream(folder); 

    out.putNextEntry(new ZipEntry(name)); 

    int len; 

    while((len = in.read(buffer)) > 0) { 
     out.write(buffer, 0, len); 
    } 

    out.closeEntry(); 
    in.close(); 
    out.close(); 
} 

Edit: ich das Problem gefunden, es wurde nur Probleme, Dateien aus dem C schreiben: \ in eine ZIP im Laufwerk F: \ Laufwerk

+0

Wenn Sie über die Dateien in den angegebenen Ordner zu wiederholen, verwenden Sie die [ 'Listfiles() '-Methode] (http://docs.oracle.com/javase/6/docs/api/java/io/File.html#listFiles()) Ihres' File'-Objekts. –

Antwort

14

Sie können Ordner nicht komprimieren, nur Dateien. Um Ordner zu komprimieren, müssen Sie alle Subdateien manuell hinzufügen. Ich habe diese Klasse geschrieben, die den Job macht. Sie können es kostenlos :) haben

Die Verwendung dieses wäre:

List<File> sources = new ArrayList<File>(); 
sources.add(tobackup); 
Packager.packZip(new File(zipName), sources); 

Hier ist die Klasse:

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.List; 
import java.util.zip.Deflater; 
import java.util.zip.ZipEntry; 
import java.util.zip.ZipOutputStream; 

public class Packager 
{ 
    public static void packZip(File output, List<File> sources) throws IOException 
    { 
     System.out.println("Packaging to " + output.getName()); 
     ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(output)); 
     zipOut.setLevel(Deflater.DEFAULT_COMPRESSION); 

     for (File source : sources) 
     { 
      if (source.isDirectory()) 
      { 
       zipDir(zipOut, "", source); 
      } else 
      { 
       zipFile(zipOut, "", source); 
      } 
     } 
     zipOut.flush(); 
     zipOut.close(); 
     System.out.println("Done"); 
    } 

    private static String buildPath(String path, String file) 
    { 
     if (path == null || path.isEmpty()) 
     { 
      return file; 
     } else 
     { 
      return path + "/" + file; 
     } 
    } 

    private static void zipDir(ZipOutputStream zos, String path, File dir) throws IOException 
    { 
     if (!dir.canRead()) 
     { 
      System.out.println("Cannot read " + dir.getCanonicalPath() + " (maybe because of permissions)"); 
      return; 
     } 

     File[] files = dir.listFiles(); 
     path = buildPath(path, dir.getName()); 
     System.out.println("Adding Directory " + path); 

     for (File source : files) 
     { 
      if (source.isDirectory()) 
      { 
       zipDir(zos, path, source); 
      } else 
      { 
       zipFile(zos, path, source); 
      } 
     } 

     System.out.println("Leaving Directory " + path); 
    } 

    private static void zipFile(ZipOutputStream zos, String path, File file) throws IOException 
    { 
     if (!file.canRead()) 
     { 
      System.out.println("Cannot read " + file.getCanonicalPath() + " (maybe because of permissions)"); 
      return; 
     } 

     System.out.println("Compressing " + file.getName()); 
     zos.putNextEntry(new ZipEntry(buildPath(path, file.getName()))); 

     FileInputStream fis = new FileInputStream(file); 

     byte[] buffer = new byte[4092]; 
     int byteCount = 0; 
     while ((byteCount = fis.read(buffer)) != -1) 
     { 
      zos.write(buffer, 0, byteCount); 
      System.out.print('.'); 
      System.out.flush(); 
     } 
     System.out.println(); 

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

Viel Spaß!

EDIT: Um zu überprüfen, ob das Programm noch damit beschäftigt ist, können Sie die drei Zeilen hinzufügen I mit einem Stern (*)

EDIT 2 markiert: Versuchen Sie den neuen Code. Auf meiner Plattform läuft es korrekt (OS X). Ich bin mir nicht sicher, aber es könnte einige eingeschränkte Leseberechtigungen für Dateien in Windows in AppData geben.

+0

Danke! Ich werde sehen, wie es geht! EDIT: Es sah gut aus, es komprimiert es (: D), aber es ist anscheinend ungültig. Fehler: Der komprimierte (gezippte) Ordner "F: \ David-PC \ 2012-03-11-25 \ 2012-03-11-25.zip" ist ungültig. – cheese5505

+0

Warte - Hmm, komisch. Es hat sich automatisch ohne Grund beendet. "Erledigt." ist nicht erschienen. – cheese5505

+1

+1 Schöner Kerl! – GingerHead

2

Siehe auch ZeroTurnaround's Zip library. Es hat solche Eigenschaften wie (Zitat):

  • Pack und entpacken Verzeichnisse rekursiv
  • Iterierte durch ZIP Einträge
Verwandte Themen