Bonjour à tous !
J'ai egalement du passer par la problèmatique de Zipper un repertoire en Java ainsi que tous ces sous répertoires.
M. Google m'a très rapidement redirigé vers codeSource

J'avoue que le principe de cet algo m'a bien aidé, mais avait kan meme deux gros inconvénient !
- L'utilisation de librairie spécifique alors que les lib java de base font aussi bien
- Ce bout de code ne fonctionne qu'à partir de Java 1.5 (et oui, y'en a qui travail encore avec de plus vieille version de java

)
Voici la version remasterisé, qui fonctionne avec Java 1.4 (pas testé avec les versions antérieur), et qui ne nécéssite aucune librairie complémentaire !
[CODE]
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class testZipRecursif {
static final int BUFFER = 2048;
/**
* Zip un répertoire en modifiant le niveau de compression
* @param args
*/
public static void main(String[] args) {
//Declaration du repertoire à zipper (linux version)
//String REP_A_ZIPPER = "//var//testZip//AZipper//";
//Declaration du repertoire à zipper (windows version)
String REP_A_ZIPPER = "\\var\\testZip\\AZipper\\";
//Declaration du fichier final (linux version)
//String ZIP_FILE = "//var//testZip//myfigsLevel.zip";
//Declaration du fichier final (windows version)
String ZIP_FILE = "\\var\\testZip\\myfigsLevel.zip";
//Declaration du niveau de compression
int zipLevel = 0;
//Zip recursif d'un repertoire
zipRepertoire(REP_A_ZIPPER, ZIP_FILE, zipLevel);
}
/**
* Zip recursivement le contenu d'un repertoire
* @param REP_A_ZIPPER Le repertoire en entree
* @param ZIP_FILE Le fichier de sortie
* @param zipLevel Le niveau de compression
*/
private static void zipRepertoire(String REP_A_ZIPPER, String ZIP_FILE, int zipLevel){
try {
//Creation du fichier final
FileOutputStream dest = new
FileOutputStream(ZIP_FILE);
ZipOutputStream out = new ZipOutputStream(new
BufferedOutputStream(dest));
//On definit le niveau de compression
out.setLevel(zipLevel);
//On zip recursivement le contenu d'un repertoire
//Ainsi que de ses sous repertoires
ZipRecusive(out, REP_A_ZIPPER, "");
out.close();
} catch(IOException e) {
e.printStackTrace();
}
}
/**
* Permet de traiter recursivement le contenu d'un repertoire
* @param out Le flux zip de sortie
* @param REP_A_ZIPPER Le repertoire de base à zipper
* @param RecursivePath Le sous repertoire que l'on traite
*/
private static void ZipRecusive(ZipOutputStream out, String REP_A_ZIPPER, String RecursivePath){
byte data[] = new byte[BUFFER];
//Creatin de la liste des fichiers present dans un repertoire
File f = new File(REP_A_ZIPPER+RecursivePath);
String files[] = f.list();
BufferedInputStream origin = null;
ArrayList listDirectory = new ArrayList();
try{
//On parcourt la liste des fichiers du repertoire
for (int i=0; i<files.length; i++) {
//On recupere le nom du fichier
String fileName = files[i];
//On reconstruit le chemin complet du fichier
String pathAndFile = REP_A_ZIPPER+RecursivePath+fileName;
//On cherche a savoir si il s'agit un repertoir ou d'un fichier
File fileTmp = new File(pathAndFile);
//Si il s'agit d'un repertoire,
//on l'ajoute dans une liste de repertoire à traiter
if (fileTmp.isDirectory()){
listDirectory.add(fileName);
} else {
//Traitement du fichier courant
FileInputStream fi = new
FileInputStream(pathAndFile);
origin = new
BufferedInputStream(fi, BUFFER);
//Debut du zipage du fichier courant
ZipEntry entry = new ZipEntry(RecursivePath+fileName);
out.putNextEntry(entry);
int count;
while((count = origin.read(data, 0,
BUFFER)) != -1) {
out.write(data, 0, count);
}
origin.close();
}
}
//Parcours de la liste des répertoires present dans le repertoire courant
String[] directoriesName = convertArrayListToStringTab(listDirectory);
for (int i=0; i<directoriesName.length; i++) {
String directory = directoriesName[i];
ZipRecusive(out, REP_A_ZIPPER, directory+"\\");
}
} catch(IOException e) {
e.printStackTrace();
}
}
/**
* Convertir un ArrayList en String[]
* @return un tableau de chaine de caractère
*/
private static String[] convertArrayListToStringTab(ArrayList list){
String[] res = new String[list.size()];
for (int i=0; i<list.size(); i++){
res[i] = list.get(i).toString();
}
return res;
}
}
[/CODE]
Voili voilou !
