Leeres Verzeichnis in Zip File aufnehmen
-
Hallo zusammen,
ich habe eine Verzeichnisstruktur mit folgendem Aufbau:
Hauptverzeichnis |- Unterverzeichnis1 |- Datei1 |- Datei1 |- Unterverzeichnis2 |- Datei1 |- Unterverzeichnis3 |- Unterverzeichnis4
Die Unterverzeichnisse samt der enthaltenen Dateien sollen in ein Zip-Archiv zusammengepackt werden.
Nun habe ich folgendes Problem, die Verzeichnisse, die eine oder mehrere Dateien enthalten, werden problemlos aufgenommen, nur die leeren Verzeichnisse, werden nicht mit aufgenommen.
Leider verlangt die Anwendung, die das Zip weiterverarbeitet auch die leeren Verzeichnisse, sonst bricht es mit einer Fehlermeldung ab, das das Archiv nicht den korrekten Aufbau / die benötigten Inhalte hat.Mit folgender Funktion packe ich die Dateien:
public void compressFilesInFolder(String sSourceFolder,String sTargetFile) { // DateiListe erstellen this.m_aFileList = new ArrayList(); // Funktion getFileList ermittelt rekursiv den Verzeichnisbaum // und Speichert ihn ein einer ArrayList this.m_aFileList // ab this.getFileList(sSourceFolder); FileInputStream in; byte[] data = new byte[1024]; int read = 0; try { ZipOutputStream out = new ZipOutputStream(new FileOutputStream(sTargetFile)); // Dateiliste in Archiv packen for(int i=0; i < this.m_aFileList.size(); ++i) { try { String sNameForFolder = ((String)this.m_aFileList.get(i)).substring((sSourceFolder.length()+1)); ZipEntry entry = new ZipEntry(sNameForFolder); File fTemp = new File((String)this.m_aFileList.get(i)); out.setMethod(ZipOutputStream.DEFLATED); out.putNextEntry(entry); in = new FileInputStream(((String)this.m_aFileList.get(i))); while((read = in.read(data,0,1024)) != -1) { out.write(data,0,read); } in.close(); out.closeEntry(); } catch(Exception e) { System.out.println("Konnte Datei "+((String)this.m_aFileList.get(i))+" nicht zum Archiv hinzufügen!\n("+e.toString()+"" ); } } out.close(); } catch(Exception e) { System.out.println("Fehler beim Komprimieren: "+e.toString()); } }
Die Funktion zum Ermitteln des Dateibaums ist folgende:
private void getFileList(String sFolder) { File file = new File(sFolder); File[] fileList = file.listFiles(); for(int i=0;i<fileList.length;++i) { if(!fileList[i].isDirectory()) this.m_aFileList.add(fileList[i].getAbsolutePath()); else { // durch das hinzufügen von \\. wird zwar das Verzeichnis angelegt, // aber ich habe im Zip Archiv dann natürlich ungültige Dateien liegen... this.m_aFileList.add(fileList[i].getAbsolutePath()+"\\."); // rufe mich selbst auf, um Inhalt der Unterverzeichnisse zu bekommen this.getFileList(fileList[i].getAbsolutePath()); } } }
Wenn ich ein Verzeichnis finde, und an den Verzeichnisnamen einen \. anfüge, wird zwar das Verzeichnis im Zip erstellt, aber es enthält eben eine irreguläre Datei ".", was von dem weiterverarbeitenden Programm natürlich auch angemeckert wird.
Ohne den Punkt werden leere Verzeichnisse nicht angelegt.
Lange Rede kurzer Sinn, hat mir jemand nen Tip, wie ich ein leeres Verzeichnis in ein Zip-Archiv bekomme? Irgendwie gehen muss es ja, WinRar kann das ja auch
Grüße
dzab
-
Ein Blick in die API-Dokumentation für die ZipEntry-Methode isDirectory() verrät Folgendes:
Returns true if this is a directory entry. A directory entry is defined to be one whose name ends with a '/'.
Also sollte der Name des Eintrags lediglich mit diesem Zeichen beendet werden und er wird als Verzeichnis interpretiert.
ZipOutputStream out = new ZipOutputStream(new FileOutputStream("C:\\test.ZIP")); ZipEntry eintrag = new ZipEntry("Temp/"); System.out.println(eintrag.isDirectory()); out.putNextEntry(eintrag); out.close();
WinRar beispielsweise zeigt das dann auch als Verzeichnis an.
-
Oh, das hab ich wohl irgendwie überlesen, jetzt geht es.
Viele Dank!!