Verzeichnisbaum zippen

Hallo liebe Experten,

zum zippen von Dateien eines Verzeichnisses ist es mir gelungen,
eine funktionstüchtige Klasse zu schreiben.

Als in das Verzeichnis ein Unterordner mit Dateien eingefügt wurde,
erhalte ich eine Fehlermeldung.
Es kommt eine FileNotFoundException.

Hier ist der Quellcode:

_public class CreateZipFile  
{  
 /\*\* Die Klasse kopiert den Inhalt eines Verzeichnisses in eine Zip-Datei  
 \* und speichert diese in diesem Verzeichnis.  
 \* @param dir Verzeichnis, dessen Inhalt in eine Zip-Datei   
 \* eingelesen werden soll.   
 \* @param zipFileName Der Name, den die Zip-Datei haben soll.   
 \* @throws IOException \*/  
 public CreateZipFile (String dir, String zipFileName) throws IOException  
 {  
 // Buffer zum Auslesen der Dateien.  
 byte[] buf = new byte[4096];  
  
 // Der vollständige Pfad zur zukünftigen Zip-Datei.  
 String dirFile = dir + zipFileName;  
  
 // Die Gästebuch-Dateien werden in diese Datei geschrieben.  
 ZipOutputStream zipOut =   
 new ZipOutputStream( new FileOutputStream(dirFile));  
  
 // Das Verzeichnis, dessen Dateien gesichert werden sollen.  
 File dirZip = new File(dir);  
  
 // Alle Dateinamen aus dem Verzeichnis werden in des Array eingelesen.  
 File [] fileArray = dirZip.listFiles();  
  
 String fileName = "";  
  
 // Alle Dateien auslesen.  
 for(int i = 0; i 0)   
 {  
 zipOut.write(buf, 0, len);  
 }  
  
 inFile.close();  
 }  
  
 // Die Zip-Datei ist erzeugt.  
 zipOut.close();  
 }  
}_  

Weiß jemand, wie ich den Code verändern muss,
damit auch die Unterverzeichnisse gezippt werden.

An allgemeinen Aussagen bin ich weniger interessiert.
Ich würde mich freuen, wenn mir jemand den Code ergänzen könnte.

Danke
und tschüs
Uwe

Moien

Es kommt eine FileNotFoundException.

Schränken wir das ganze ein: In welcher Zeile ?

cu

Hallo Laurent,
schön, dass du dich kümmerst.

Es kommt eine FileNotFoundException.

Schränken wir das ganze ein: In welcher Zeile ?

// Die Datei wird zum Lesen geöffnet.
FileInputStream inFile = new FileInputStream(fileName);

Das ist die Fehlermeldung:

java.io.FileNotFoundException: D:\data\test (Zugriff verweigert)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.(Unknown Source)
at java.io.FileInputStream.(Unknown Source)
at util.CreateZipFile.(CreateZipFile.java:48)

Bisher werden erfolgreich alle Dateien in D:\Data\ gezippt.
der Unterordner test verursacht den Fehler.

Danke für die Mühe
und tschüs
Uwe

Hi ho,

das Problem ist, dass sich ein Verzeichnis so nicht zippen lässt (ein Blick in die JavaDoc hätte geholfen).

So funktionierts mit beliebig tiefen Verzeichnishierarchien:

 /\*\*
 \* Die Klasse kopiert den Inhalt eines Verzeichnisses in eine 
 \* Zip-Datei und speichert diese in diesem Verzeichnis.
 \* 
 \* @param dir
 \* Verzeichnis, dessen Inhalt in eine Zip-Datei eingelesen werden soll.
 \* @param zipFileName
 \* Der Name, den die Zip-Datei haben soll.
 \* @throws IOException
 \*/
 public CreateZipFile(String dir, String zipFileName) throws IOException
 {
 // Buffer zum Auslesen der Dateien.

 // Der vollständige Pfad zur zukünftigen Zip-Datei.
 String dirFile = dir + zipFileName;
 // Die Gästebuch-Dateien werden in diese Datei geschrieben.
 ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(dirFile));
 // Das Verzeichnis, dessen Dateien gesichert werden sollen.
 File dirZip = new File(dir);
 zipFiles(dirZip, zipOut);
 // Die Zip-Datei ist erzeugt.
 zipOut.close();
 }

 public void zipFiles(File dirZip, ZipOutputStream zipOut) throws IOException
 {
 byte[] buf = new byte[4096];
 // Alle Dateinamen aus dem Verzeichnis werden in des Array eingelesen.
 File[] fileArray = dirZip.listFiles();
 String fileName = "";
 // Alle Dateien auslesen.
 for (int i = 0; i 0)
 {
 zipOut.write(buf, 0, len);
 }
 inFile.close();
 }
 }

 }

Gruss,

Herb

1 Like

Dafür gibt es ein Sternchen
Hallo Herb,

rekursiv.
Einfach und logisch.
Hat auf Anhieb funktioniert.

Dafür gibt es ein Sternchen.

Grüße aus Sachsen nach Baden Württemberg
Danke und tschüs
Uwe

PS: Für den Spieltrieb, guckst du
http://www.haller-mtl.de/breakout/index.html

.