1Danke
ERLEDIGT
NEIN
NEIN
ANTWORTEN
8
8
ZUGRIFFE
2850
2850
EMPFEHLEN
-
16.03.07 15:18 #1
Mitglied Platin
- Registriert seit
- May 2004
- Beiträge
- 684
Hallo,
ich habe z.Z. ein kleines Problem, was das handling von Zip-Files in Java angeht. Ich kann sehr leicht ein Zip File erstellen und Dateien hinzufügen (Stichwort ZipOutputStream, ZipEntry etc...).
Aber: ich würde dem Zip File gerne ein Verzeichnis hinzufügen, und zwar ein leeres.
Ich habe das Gefühl, dass die ZipEntrys nur Dateien sein können. Ich hoffe, dass ich damit nicht recht habe.
Kann mir jemand helfen?
Danke!
-
19.03.07 12:38 #2MeinerEiner_80 Tutorials.de Gastzugang
Moin!
So gehts:
Code :1 2 3 4 5
ZipOutputStream zout = new ZipOutputStream(new FileOutputStream("F:/test.zip")); ZipEntry e = new ZipEntry("Test/"); zout.putNextEntry(e); zout.closeEntry(); zout.close();
*grüssle*
MeinerEiner
-
19.03.07 13:35 #3
Hallo,
nein du kannst auch (leere) Verzeichnisse zippen. Das Problem dabei ist nur, dass einige Packprogramme wie WinZip scheinbar nicht richtige mit leeren Verzeichnissen umgehen können... (sprich der leere Ordner ist im Zip wird aber nicht angezeigt)Ich habe das Gefühl, dass die ZipEntrys nur Dateien sein können. Ich hoffe, dass ich damit nicht recht habe.
Gruß TomJava rocks! http://www.jugsaar.de
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
23.09.09 09:51 #4
Hallo zusammen,
ich muss dieses Thema nochmal aufgreifen.
Die meisten legen für Ordner erst gar keine ZipEntries an, und fahren damit sicher mit den meisten Zip-Programmen gut. Ich möchte aber Zip-Folder kommentieren. Das Kommandozeilentool zip kann das mit der Option -c also geht das prinzipiell.
Ich versuche das folgender maßen:
Wenn ich mir das mit unzip anschaue sieht das zuerst gut aus:Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
package org.example.zip; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipOutputStream; public class ZipTest { public static void main (String argv[]) { try { FileOutputStream dest = new FileOutputStream("/tmp/checkFolder.zip"); ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest)); ZipEntry folderEntry = new ZipEntry("TestFolder"); folderEntry.setComment("My Folder comment."); out.putNextEntry(folderEntry); out.closeEntry(); ZipEntry fileEntry = new ZipEntry("TestFolder/TestFile.txt"); fileEntry.setComment("My File comment."); out.putNextEntry(fileEntry); out.write("Hallo Zip!".getBytes()); out.closeEntry(); out.close(); } catch(Exception e) { e.printStackTrace(); } } }
Das mit Windows ausgeliefert "eingebaute" Zip findet leider immer leere Dateien mit dem Namen des Ordners und unzip hat natürlich ein Problem sowas auszupacken:Code :1 2 3 4 5 6 7 8 9
Archive: /tmp/checkFolder.zip Length Date Time Name -------- ---- ---- ---- 0 09-22-09 15:09 TestFolder My Folder comment. 10 09-22-09 15:09 TestFolder/TestFile.txt My File comment. -------- ------- 10 2 files
Kann man nicht doch irgendwie einem ZipEntry sagen, das es ein Verzeichnis ist?Code :1 2 3 4 5
unzip /tmp/checkFolder.zip Archive: /tmp/checkFolder.zip inflating: TestFolder checkdir error: TestFolder exists but is not directory unable to process TestFolder/TestFile.txt.
Wie kann man ein Verzeichnis mit Kommentar anlegen?
Viele Grüße
Arne
-
23.09.09 12:33 #5
Hallo,
wenn ich mir hiermit mal ein Zip File generieren lasse und mir anschließend das Zip mit der Windows Zip Unterstützung anschaue, sehe ich
"test1" als Datei
"test2" als Ordner und darin die Datei "test3".
Wenn ich dieses zip jedoch entpacke bekomme ich korrekte Verzeichnisse angelegt.
Deshalb die Frage: Ist es wirklich so schlimm, wenn du mit der Windows Zip Unterstützung die Verzeichnisse nicht richtig siehst? Schließlich sind sie ja da wenn man das zip entpackt.
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14
public class ZipWithEmtpyDirectoriesExample { /** * @param args */ public static void main(String[] args) throws Exception{ ZipOutputStream zip = new ZipOutputStream(new FileOutputStream("/tmp/zipWithEmptyFolders.zip")); zip.putNextEntry(new ZipEntry("test1/")); zip.putNextEntry(new ZipEntry("test2/test3/")); zip.closeEntry(); zip.close(); } }
Gruß TomJava rocks! http://www.jugsaar.de
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
23.09.09 13:13 #6
Hi Tom,
danke Dir für Deine Antwort. Natürlich ist es kein Beinbruch wenn mir ein Windows-Zip ein Verzeichnis und eine Datei mit dem selben Namen anzeigt. Bis auf das Kommando-Zeilentool unzip scheinen sowieso alle zip-Programme sich sehr viel Mühe zu geben ohne Fehlermeldungen zip-Files auszupacken.
Aber das ZipEntry hat ja immerhin die Methode isDirectory() . Und das nicht ohne Grund: Das auspackende Programm muss da einen Ordner anlegen. Wie wird dieser Boolean bestimmt? Ist ein leerer Eintrag immer ein Folder? Wo ist der Setter?
Ich habe die apache-zip-utils aus dem ant.jar genommen, weil man damit das Encoding für Dateinamen und Kommentare setzen kann. (Kann ich nur jedem ans Herz legen. Achtung unterschiedlich Encoding für unterschiedliche Plattformen: Windows braucht "Cp437" der Rest der Welt "UTF-8")
Im Java-Doc vom ZipOutputStream steht dazu:
Könnten dieses isDirectory nicht ein "especially internal/external file attributes" sein?Reimplementation of java.util.zip.ZipOutputStream that does handle the extended functionality of this package, especially internal/external file attributes and extra fields with different layouts for local file data and central directory entries.
Leider wird im Weiteren nicht mehr darauf eingegangen?
Tom hast Du schon mal was mit diesen "file attributes" gemacht?
Weißt Du was die meinen?
Viele Grüße
Arne
-
23.09.09 23:17 #7
Hallo,
In der Apache Ant Variante von ZipEntry ist die isDirectory Methode folgendermaßen implementiert:Aber das ZipEntry hat ja immerhin die Methode isDirectory() . Und das nicht ohne Grund: Das auspackende Programm muss da einen Ordner anlegen. Wie wird dieser Boolean bestimmt? Ist ein leerer Eintrag immer ein Folder? Wo ist der Setter?
Code java:1 2 3 4
public boolean isDirectory() { return getName().endsWith("/"); }
... also nicht als "Special Attribut" sondern eher als eine Namenskonvention.
Gruß TomJava rocks! http://www.jugsaar.de
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
24.09.09 10:25 #8
Hi Thomas,
ja, ein scharfer Blick in den Source kann ja Berge versetzen.
Danke Dir Thomas!
Unzip lässt sich mit mit Deinem Tipp tatsächlich dazu überreden das Zip-File auszupacken.
Mein gewünschtes explizites Setzen der Art eines ZipEntries, kann (und muss - meiner Meinung nach) dennoch durchgeführt werden.
Man muss das 4. Bit der External-Atrributes setzen! Ist dieses Bit an, ist es ein Verzeichnis, ist es aus, handelt es sich um eine Datei.
Hier nochmal das komplette Beispiel zum Mitschreiben:
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
package org.example; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipOutputStream; public class ZipTest { public final static long ZIPENTRY_IS_DIRECTORY = 1<<4; public final static String WINDOW_ZIP_ENCODING="Cp437"; public final static String NON_WINDOW_ZIP_ENCODING="UTF-8"; public static void main (String argv[]) { try { // Bitmask indicating directories in 'external attributes' of a ZIP archive entry. FileOutputStream dest = new FileOutputStream("/tmp/checkFolder.zip"); ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest)); out.setEncoding(WINDOW_ZIP_ENCODING); ZipEntry folderEntry = new ZipEntry("TestFolder/"); folderEntry.setExternalAttributes(folderEntry.getExternalAttributes()|ZIPENTRY_IS_DIRECTORY); folderEntry.setComment("My Folder comment."); out.putNextEntry(folderEntry); out.closeEntry(); ZipEntry fileEntry = new ZipEntry("TestFolder/TestFile.txt"); fileEntry.setComment("My File comment."); out.putNextEntry(fileEntry); out.write("Hallo Zip!".getBytes()); out.closeEntry(); out.close(); } catch(Exception e) { e.printStackTrace(); } } }
Nun kann auch Windows-Zip was damit anfangen.
Alternativ kann man auch sinniger Weise den Unixmode setzen.
Der rechnet nämlich ganz neben bei ein komplettes ExternalAttribute zusammen.
Natürlich für Verzeichnisse nur richtig, wenn Dein Slash am Ende des Verzeichnis-Namens steht.
Das sollte dann zu allen möglichen Plattformen kompatible sein.Code java:1 2 3 4 5 6 7 8
public void setUnixMode(int mode) { setExternalAttributes((mode << 16) // MS-DOS read-only attribute | ((mode & 0200) == 0 ? 1 : 0) // MS-DOS directory flag | (isDirectory() ? 0x10 : 0)); platform = PLATFORM_UNIX; }
Viele Grüße
ArneGeändert von DasArne (24.09.09 um 10:39 Uhr)
-
24.09.09 11:31 #9
Hallo,
coole Sache, danke für den Tipp
Gruß TomJava rocks! http://www.jugsaar.de
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
Ähnliche Themen
-
Eingräge einer List<String> in xml datei hinzufügen/entfernen?
Von will2k im Forum JavaAntworten: 8Letzter Beitrag: 19.05.08, 12:03 -
Komponente entfernen + hinzufügen -> Leeres Frame?
Von Smily0412 im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 1Letzter Beitrag: 11.01.08, 12:11 -
"include" wenn datei 1 Verz. Tiefer liegt.
Von xony im Forum PHPAntworten: 1Letzter Beitrag: 30.01.05, 00:41 -
Bilder aus Verz. auslesen & Weiter Blättern
Von Rasty im Forum PHPAntworten: 6Letzter Beitrag: 02.10.03, 15:59 -
alle bilder aus einem verz. anzeigen + link
Von XTender im Forum PHPAntworten: 3Letzter Beitrag: 19.04.02, 09:46




Zitieren

Login