# ZIPPEN von Datein, Ordnern und Unterordnern



## user0009 (30. Jul 2007)

Hallo!

Ich möchte alle Ordner, Unterordner und Dateien im Verzeichnis C:\Java\Programmierung\neu\projekt\
in ein Zipfile zippen. Allerdings habe ich derzeit folgendes Problem:
Mit meinem Code kann ich nur immer den Inhalt eines Ordners ohne Unterordner zu einem Ziparchiv hinzufügen.
Die struktur die gezippt werden soll schaut ungefähr so aus:

Ordner1 -> Unterordner1 -> 30 Files
Ordner1 -> 10 Files
Ordner1 -> Unterordner2 -> 5 Files
....

So nun habe ich folgenden Code der mir zumindest die Files eines Ordners gezippt hat:



```
File nf = new File(TempBasisDirectory);
String filedir = nf.getParent();
File dirZip = new File (filedir);
        ZipOutputStream zipOut = new ZipOutputStream( new FileOutputStream("archiv.zip"));
        File [] fileArray = dirZip.listFiles();
		try{
			 for(i = 0; i < fileArray.length; i++)
             {
                fileName = fileArray[i].getAbsolutePath();
                FileInputStream inFile = new FileInputStream(fileName);
                zipOut.putNextEntry(new ZipEntry(fileName));
                int len; 
                while ((len = inFile.read(buf)) > 0) 
                {
                    zipOut.write(buf, 0, len);
                }
                inFile.close();
             }
             zipOut.close();
```


----------



## jPat (30. Jul 2007)

Versuch es doch rekursiv ....


----------



## deleted (30. Jul 2007)

Ich nehm mal an, das kennt er nicht 

Pseudocode:


Methode Zippen(File "ein Ordner") {

Dateiliste liste[] = AlleFilesDiesesOrdners;

ForEach(liste[]) {
Wenn Datei ist Datei:
Zippe diese Datei!

Wenn Datei ist Ordner:
Zippen(diese Datei);

}

}

So hangelt sich dein Programm durch alle Dateien durch.
Das ist zwar nicht sonderlich schnell, aber wenn du nicht zu viele Dateien hast, geht das sehr gut!

Wie du siehst, ruft sich die Methode selbst auf!
Und zwar immer dann, wenn eine Datei in einem Ordner ein Ordner ist mit dieser Datei als Parameter!

Das Ganze nennt sich Rekursion:

http://de.wikipedia.org/wiki/Rekursion

Es ist nicht ganz einfach zu verstehen.
Als ich mich das erste Mal damit auseinandersetzen musste, kam ich ganz schön ins Schwitzen (v.a. bei schwierigeren Aufgaben).

Sollte dir das unverständlich vorkommen, frag ruhig!


----------



## user0009 (31. Jul 2007)

Ja das klingt mal nicht schlecht.

Allerdings wie mache ich diese Abfrage:

```
if(file==file){
zippen....
}else if (file==folder){
zippen(folder);
}
```

?


----------



## SlaterB (31. Jul 2007)

tja, die API muss man manchmal schon alleine lesen  :
http://java.sun.com/javase/6/docs/api/java/io/File.html


----------



## user0009 (31. Jul 2007)

Problem hat sich schon gelöst.
Eine Frage habe ich noch und zwar wie bekomme ich nur relative Pfadangaben für das Archiv.
Momentan speichert es für jede Datei die Pfade so ab: C: | Ordner1 | Ordner2 | Ordner3 | Datei.txt
Ich möchte aber das wenn das Archiv im Ordner2 angelegt wird, dass dann nur mehr die Dateien mit folgendem
Pfad versehen werden:

Datei.txt Ordner2 / Ordner3

Ich hoffe ihr kennt euch aus was ich meine.


----------



## virus (6. Nov 2007)

user0009 hat gesagt.:
			
		

> Eine Frage habe ich noch und zwar wie bekomme ich nur relative Pfadangaben für das Archiv.
> Momentan speichert es für jede Datei die Pfade so ab: C: | Ordner1 | Ordner2 | Ordner3 | Datei.txt
> Ich möchte aber das wenn das Archiv im Ordner2 angelegt wird, dass dann nur mehr die Dateien mit folgendem
> Pfad versehen werden:
> ...



Genau das problem hab ich auch. Ich verwende auch eine rekursive funktion die mir eine ganze ordnerstruktur durchgeht und immer wenn eine datei gefunde wurde wird

```
zos.putNextEntry(new ZipEntry(f.getAbsolutePath()));
```
gemacht.

Wie krieg ich das nun hin das mir nicht immer der ganze absoluten pfad gespeichert wird? Sondern nur von dem ordner von dem aus ich starte?


----------



## Gast (29. Feb 2008)

Na in dem du einfach vor dem Zip-Vorgang dir den absoluten Pfad besorgst (siehe API) und denn den jeweiligen neuen absoluten Pfad hernimmst und ihn über eine String-Operation verkürzt.

Z.b.

Vor Zipvorgang:    Pfad = /home/ich/bin/test
Während Zip:         Pfad = /home/ich/bin/test/foo/bar

Während - Vor:     Pfad = /foo/bar


----------

