IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

[Fichier Zip] Comment zipper un dossier


Sujet :

Entrée/Sortie Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 48
    Points : 51
    Points
    51
    Par défaut [Fichier Zip] Comment zipper un dossier
    *Inspiré sur le sujet /http://www.developpez.net/forums/d11943/java/general-java/apis/io/fichier-zip-zipper-fichier/*

    Bonjour,

    J'ai un soucis au moment de créer mon archive, j'ai utilisé la méthode save(unString).

    Mon problème est qu'il va créer une archive en incluant le chemin que je lui transmets.

    Je souhaiterais avec une archive de ce type
    |_Mon fichier
    |_Mon fichier2

    et non:
    |_ICI
    ...|_LE
    ......|_CHEMIN
    .........|_Mon fichier
    .........|_Mon fichier2

    Je n'ai pas trouvé de solution.... une idée?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
        private void save(String zipName) {
    	try {
    	    ZipOutputStream zip = new ZipOutputStream(new FileOutputStream(zipName)); 
    	    zip.setMethod(ZipOutputStream.DEFLATED); 
    	    zip.setLevel(Deflater.BEST_COMPRESSION);
     
    	    File dataDirectories = new File("ICI/LE/CHEMIN");
    	    zipDirectory(dataDirectories, zip);
    	    zip.close();
    	} catch (FileNotFoundException fileNotFound) {}
    	catch (IOException io) {}
        }
     
        private void zipDirectory(File directory, ZipOutputStream zip) {
    	String[] listFile = directory.list();
    	for (int i = 0; i < listFile.length; i++) {
    	    try {
    		File file = new File(directory.getPath()+"/"+listFile[i]);
    		if (file.isDirectory()) zipDirectory(file, zip);
    		else {
    		    FileInputStream in = new FileInputStream(file);
    		    byte[] bytes = new byte[in.available()];
    		    in.read(bytes);
    		    in.close();
     
    		    ZipEntry entry = new ZipEntry(file.getPath());
    		    entry.setTime(file.lastModified());
    		    zip.putNextEntry(entry);
    		    zip.write(bytes);
    		    zip.closeEntry();
    		}
    	    } catch (FileNotFoundException fileNotFound) {}
    	    catch (IOException io) {}
    	}
        }

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,



    Déjà je vois plusieurs "problèmes" dans ton code :

    • Les catch() vide sont particulièrement affreux, puisqu'en cas d'erreur tu ne verras rien du tout.
      Il serait préférable de remonter l'exception, au pire en l'encapsulant dans une RuntimeException si tu ne veux pas la traiter...
    • Ta lecture du fichier est incorrect, car rien ne garantie que la méthode available() te renvoi la taille du fichier (cela pourrait être plus petit). Du coup tu pourrais perdre des données.
      Tu pourrais tout simplement passer par une copie à la volée, qui aurait en plus l'avantage d'être moins couteuse en utilisation mémoire en cas de gros fichiers...
    • Il manque les try/finally pour la libération des ressources...



    Quand à ton problème, il vient du fait que tu utilises getPath() pour le nom de l'entry. Or c'est ce qui défini le chemin à l'intérieur du ZIP. En utilisant le path complet tu obtiendras donc l'arborescence complète.

    Si tu veux éviter cela il faut conserver le chemin de base, et l'enlever à chaque fois du nom du path.

    Bref cela devrait donner quelque chose comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    	private void save(String zipName) {
    		try {
    			ZipOutputStream zip = new ZipOutputStream(new FileOutputStream(
    					zipName));
    			try {
    				zip.setMethod(ZipOutputStream.DEFLATED);
    				zip.setLevel(Deflater.BEST_COMPRESSION);
     
    				File dataDirectories = new File("ICI/LE/CHEMIN");
    				// On récupère le chemin complet du répertoire de base :
    				String rootPath = dataDirectories.getAbsolutePath();
    				// En rajoutant le séparateur final s'il n'y est pas :
    				if (rootPath.endsWith(File.separator)==false)
    					rootPath += File.separator;
    				// Et on appelle la méthode récursive :
    				zipDirectory(dataDirectories, rootPath, zip);
    			} finally {
    				zip.close();
    			}
    		} catch (IOException io) {
    			throw new RuntimeException();
    		}
    	}
     
     
    	private void zipDirectory(File currentDir, String rootPath, ZipOutputStream zip) throws IOException {
     
    		File[] listFiles = currentDir.listFiles();
    		if (listFiles!=null) {
    			for (File file : listFiles) {
    				if (file.isDirectory()) {
    					zipDirectory(file, rootPath, zip);
    				} else {
    					FileInputStream in = new FileInputStream(file);
    					try {
    						String path = file.getPath();
    						if (path.startsWith(rootPath)) {
    							path = path.substring(rootPath.length());
    						}
    						ZipEntry entry = new ZipEntry(path);
    						entry.setTime(file.lastModified());
     
    						zip.putNextEntry(entry);
    						try {
    							byte[] bytes = new byte[8192];
    							int len;
     
    							while ( (len=in.read(bytes)) >= 0 )
    								zip.write(bytes, 0, len);
    						} finally {
    							zip.closeEntry();
    						}
    					} finally {
    						in.close();
    					}
    				}
    			}
    		}
    	}

    a++

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 48
    Points : 51
    Points
    51
    Par défaut
    Bien vu

    Je vais améliorer tout sa

    Merci!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment créer un fichier zip à l'aide de Delphi ?
    Par Invité dans le forum Langage
    Réponses: 5
    Dernier message: 29/11/2018, 16h21
  2. [ZIP] Comment zipper un dossier avec java?
    Par david06600 dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 05/05/2010, 21h22
  3. Comment zipper un dossier avec son arborescence?
    Par planplan95 dans le forum ANT
    Réponses: 1
    Dernier message: 08/08/2008, 10h56
  4. [Abrevia] Comment zipper un fichier sans inclure son répertoire ?
    Par DelphiSteph dans le forum Composants VCL
    Réponses: 2
    Dernier message: 04/02/2005, 20h01
  5. [Fichier Zip] Comment zipper un fichier
    Par caro_a dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 27/05/2004, 09h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo