java.util.zip - Neuerstellung directory-Struktur
Beim Versuch das zip-Archiv mit der java.util.zip
ich lief in eine Menge Probleme, die meisten, die ich gelöst. Jetzt, wo ich endlich eine Ausgabe, die ich Kampf mit immer den "richtigen" Ausgang. Ich habe einen extrahierten ODT-Datei (Verzeichnis wäre treffender Beschreibung), zu denen habe ich einige Modifikationen. Ich will jetzt komprimieren Sie dieses Verzeichnis zu erstellen Sie die ODT-Datei-Struktur. Zippen Sie das Verzeichnis und umbenennen Sie es zu Ende mit .odt funktioniert also sollte es kein problem sein.
Das Hauptproblem ist, dass ich verlieren die interne Struktur des Verzeichnisses. Alles wird "flach" und ich kann nicht scheinen, einen Weg finden, um die Erhaltung der ursprünglichen multi-layered structure. Ich würde schätzen etwas Hilfe, wie ich kann nicht scheinen, um das problem zu finden.
Hier sind die relevanten code-snippets:
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
FILEPATH.substring(0, FILEPATH.lastIndexOf(SEPARATOR) + 1).concat("test.zip")));
compressDirectory(TEMPARCH, out);
Den SEPARATOR
ist die system-Datei-Trennzeichen und das FILEPATH
ist der Dateipfad der original-ODT -, die ich überschreiben soll, aber es nicht getan haben, hier für Testzwecke. Ich habe einfach schreiben test.zip Datei in das gleiche Verzeichnis.
private void compressDirectory(String directory, ZipOutputStream out) throws IOException
{
File fileToCompress = new File(directory);
//list contents.
String[] contents = fileToCompress.list();
//iterate through directory and compress files.
for(int i = 0; i < contents.length; i++)
{
File f = new File(directory, contents[i]);
//testing type. directories and files have to be treated separately.
if(f.isDirectory())
{
//add empty directory
out.putNextEntry(new ZipEntry(f.getName() + SEPARATOR));
//initiate recursive call
compressDirectory(f.getPath(), out);
//continue the iteration
continue;
}else{
//prepare stream to read file.
FileInputStream in = new FileInputStream(f);
//create ZipEntry and add to outputting stream.
out.putNextEntry(new ZipEntry(f.getName()));
//write the data.
int len;
while((len = in.read(data)) > 0)
{
out.write(data, 0, len);
}
out.flush();
out.closeEntry();
in.close();
}
}
}
Dem Verzeichnis, das Dateien enthält zip ist irgendwo in den user-space und nicht im gleichen Verzeichnis wie die erstellte Datei. Ich nehme an, das könnte ärger geben, aber ich kann nicht wirklich sehen, wie. Auch ich dachte mir, dass könnte das problem sein, mit den gleichen stream für die Ausgabe aber wieder ich kann nicht sehen, wie. Ich sah in einigen Beispielen und tutorials, die Sie verwenden getPath()
statt getName()
aber ändern, das gibt mir eine leere zip-Datei.
InformationsquelleAutor der Frage Eric | 2009-09-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den URI Klasse ist nützlich für die Arbeit mit relativen Pfaden.
Der obige code sendet den string
path/myfile.txt
.Vollständigkeit halber, hier ist ein
zip
Methode für die Archivierung eines Verzeichnisses:Dieser code macht nicht bewahren Termine und ich bin nicht sicher, wie er reagieren würde auf Sachen wie symlinks. Kein Versuch ist gemacht, um Sie auf Verzeichnis hinzufügen Einträge, so dass leere Verzeichnisse würde nicht enthalten sein.
Den entsprechenden
unzip
Befehl:Utility-Methoden, auf die Sie sich verlassen:
Die Größe des Puffers ist völlig willkürlich.
InformationsquelleAutor der Antwort McDowell
Ich sehe 2 Probleme in Ihrem code,
Ich meine eigene version für Ihre Referenz. Nutzen wir diese, um zip-up-Fotos zum download, damit es funktioniert mit verschiedenen unzip-Programme. Es behält die Verzeichnis-Struktur und Zeitstempel.
InformationsquelleAutor der Antwort ZZ Coder
Gehen Sie einfach durch den source von java.util.zip.ZipEntry. Es behandelt einen ZipEntry als Verzeichnis, wenn sein name endet mit " /" - Zeichen. Nur-suffix der name des Verzeichnisses mit "/".
Auch Sie brauchen, um das Laufwerk zu entfernen Präfix zu machen, relativ.
Überprüfen Sie dieses Beispiel zum zippen Sie einfach die leere Verzeichnisse,
http://bethecoder.com/applications/tutorials/showTutorials.action?tutorialId=Java_ZipUtilities_ZipEmptyDirectory
Solange Sie in der Lage sind zu erstellen, die beide leer & nicht-leere Verzeichnisse in der ZIP-Datei, die Verzeichnis-Struktur intakt ist.
Glück.
InformationsquelleAutor der Antwort user769087
Hier ist ein weiteres Beispiel (rekursive) können Sie auch "einschließen/ausschließen" des Ordners der form der zip:
InformationsquelleAutor der Antwort fcarriedo
Wenn Sie nicht die Mühe machen möchten, den Umgang mit byte-input-streams, Puffer-Größen, und anderen low-level-details. Sie können Ant-Zip-Bibliotheken aus java-code (maven-Abhängigkeiten finden Sie hier). Hier ist jetzt mache ich eine zip-bestehend aus einer Liste von Dateien & Ordner:
InformationsquelleAutor der Antwort ChoppyTheLumberjack
Zip-Inhalt eines Ordners und seiner Unterordner in Windows,
ersetzen,
mit
InformationsquelleAutor der Antwort Geo
Ich würde gern noch eine Anregung/Erinnerung hier:
Wenn du definieren Sie die Ausgabe-Verzeichnis, die gleichen wie die Eingabe, werden Sie wollen, vergleichen Sie jede Datei Namen mit der Ausgabe .zip-Datei-Namen, um zu vermeiden, komprimieren Sie die Datei in sich selbst, generieren einige unerwünschte Verhalten. Hoffe, dass dies helfen.
InformationsquelleAutor der Antwort Luca Bezerra
Dieser code snipped für mich funktioniert. Keine third-party-Bibliothek erforderlich.
InformationsquelleAutor der Antwort Alessandro Giusa