Partage
  • Partager sur Facebook
  • Partager sur Twitter

Dézipper un dossier

    27 octobre 2008 à 16:45:09

    Bonjour à tous,

    En cherchant comment dézipper un dossier contenant, en plus des fichiers, des sous-répertoires, je suis tombé sur ce morceau de code :
    import java.io.*;
    import java.util.*;
    import java.util.zip.*;
    
    
    public class Unzip {
    
      static final int BUFFER = 2048;
    
      public Unzip(String path) {
        
    	try {
    
          // préparation du zip
          BufferedOutputStream dest = null;
          BufferedInputStream is = null;
          ZipEntry entry;
          ZipFile zipfile = new ZipFile(path);
          Enumeration e = zipfile.entries();
    
          // recharche du nom du zip
          File pathNom = new File(path);
          String nomFichier = pathNom.getName();
          String nom = nomFichier.substring(0, nomFichier.length() - 4);
          //System.out.println(nom);
    
          // création du dossier racine
          File NOM = new File("../" + nom);
          NOM.mkdir();
    
          // URL de base
          String URLbase = "../" + "." + "/" + nom ;
    
    
    
          // boucle d'extraction des fichiers
          while (e.hasMoreElements()) {
    
            // préparation du fichier courant à extraire
            entry = (ZipEntry) e.nextElement();
            String url = entry.getName();
            System.out.println("Extracting: " + url);
    
            String URLfichier = URLbase + "/" + url;
            System.out.println("URL: " + URLfichier);
    
            File URL = new File(URLfichier);
    
    
            if (isFile(URL.getName())) {
              // écriture du fichier (extraction)
              is = new BufferedInputStream
                  (zipfile.getInputStream(entry));
              int count;
              byte data[] = new byte[BUFFER];
              FileOutputStream fos = new
                  FileOutputStream(URLfichier);
              dest = new
                  BufferedOutputStream(fos, BUFFER);
              while ( (count = is.read(data, 0, BUFFER))
                     != -1) {
                dest.write(data, 0, count);
              }
              dest.flush();
              dest.close();
              is.close();
            }
            else {
              // zone répértoire
              URL.mkdirs();
            }
    
          }
        }
        catch (Exception e) {
          e.printStackTrace();
        }
    
      }
    
      private boolean isFile (String nom) {
        for (int i=nom.length()-1; i>=0; i--) {
    
          if (nom.charAt(i) == '.' ) {
            return true;
          }
    
        }
    
        return false;
      }
    
    
    }
    


    Le probléme est que la vérification du type de l'élément (dossier ou fichier) se fait grâce au nom de celui-ci : s'il contient un "." il est défini comme fichier, s'il n'en comporte pas il est défini comme dossier. Or les fichiers sans extension et les dossiers avec des points existent malheureusement :).

    J'ai donc remplacé l'appel à la fonction "isFile" par un
    (if URL.isFile())
    
    mais il le programme voit tous les éléments comme des dossiers.

    Quelqu'un serait-il pourquoi?
    • Partager sur Facebook
    • Partager sur Twitter
      27 octobre 2008 à 17:07:35

      Utilise la classe FileReader qui te permet a travers des methodes isXXX de savoir s'il s'agit d'un fichier ou d'un repertoire
      • Partager sur Facebook
      • Partager sur Twitter
      J'ai tous les badges d'OpenClassrooms.
        27 octobre 2008 à 20:25:26

        Alors Eclipse ne m'affiche plus les méthodes disponibles aprés le "." qui suit un objet...trés ennuyeux.

        De toute façon il n'accepte pas mon fileReader.isFile()... donc si tu as une autre solution(ou un exemple d'utilisation de cette calsse), je suis preneur.

        Merci :)
        • Partager sur Facebook
        • Partager sur Twitter
          27 octobre 2008 à 21:56:48

          Un répertoire n'est pas censé se terminer par un '/' final ?
          Je parle ici du nom de fichier enregistré dans le .zip
          • Partager sur Facebook
          • Partager sur Twitter
            27 octobre 2008 à 22:22:41

            Cadeau:

            package com.daedric.lang.jar;
            
            
            
            import java.io.File;
            
            import java.io.FileInputStream;
            
            import java.io.FileOutputStream;
            
            import java.io.IOException;
            
            import java.util.jar.JarEntry;
            
            import java.util.jar.JarInputStream;
            
            import java.util.jar.JarOutputStream;
            
            import java.util.zip.ZipEntry;
            
            import java.util.zip.ZipInputStream;
            
            import java.util.zip.ZipOutputStream;
            
            
            
            public class ZIP {
            
            	private File	zipfile, tozip;
            
            
            
            	public ZIP(File zip, File tozip) {
            
            		this.zipfile = zip;
            
            		this.tozip = tozip;
            
            	}
            
            
            
            	public ZIP(String toUnzip) {
            
            		this(new File(toUnzip), null);
            
            	}
            
            
            
            	public ZIP(String zip, String tozip) {
            
            		this(new File(zip), new File(tozip));
            
            	}
            
            
            
            	public void uncompress(String dest) throws IOException {
            
            		uncompress(zipfile, new File(dest));
            
            	}
            
            
            
            	public static File uncompress(File zipfile, File dest) throws IOException {
            
            		ZipInputStream zin = new ZipInputStream(new FileInputStream(zipfile));
            
            		ZipEntry ze;
            
            		while ((ze = zin.getNextEntry()) != null) {
            
            			if (ze.isDirectory()) {
            
            				File dir = new File(dest.getAbsolutePath() + File.separatorChar
            
            						+ ze.getName());
            
            				if (!dir.exists())
            
            					dir.mkdir();
            
            			} else {
            
            				File f = new File(dest.getAbsolutePath() + File.separator
            
            						+ ze.getName());
            
            				if (!f.getParentFile().exists())
            
            					f.getParentFile().mkdirs();
            
            				FileOutputStream out = new FileOutputStream(dest
            
            						.getAbsolutePath()
            
            						+ File.separator + ze.getName());
            
            				byte[] buff = new byte[1024];
            
            				int read;
            
            				while ((read = zin.read(buff)) > -1)
            
            					out.write(buff, 0, read);
            
            				out.flush();
            
            				out.close();
            
            			}
            
            		}
            
            		zin.closeEntry();
            
            		zin.close();
            
            
            
            		return dest;
            
            
            
            	}
            
            
            
            	public static File uncompressjar(File zipfile, File dest)
            
            			throws IOException {
            
            		JarInputStream zin = new JarInputStream(new FileInputStream(zipfile));
            
            		JarEntry ze;
            
            		while ((ze = zin.getNextJarEntry()) != null) {
            
            			if (ze.isDirectory()) {
            
            				File dir = new File(dest.getAbsolutePath() + File.separatorChar
            
            						+ ze.getName());
            
            				if (!dir.exists())
            
            					dir.mkdir();
            
            			} else {
            
            				File f = new File(dest.getAbsolutePath() + File.separator
            
            						+ ze.getName());
            
            				if (!f.getParentFile().exists())
            
            					f.getParentFile().mkdirs();
            
            				FileOutputStream out = new FileOutputStream(dest
            
            						.getAbsolutePath()
            
            						+ File.separator + ze.getName());
            
            				byte[] buff = new byte[1024];
            
            				int read;
            
            				while ((read = zin.read(buff)) > -1)
            
            					out.write(buff, 0, read);
            
            				out.flush();
            
            				out.close();
            
            			}
            
            		}
            
            		zin.closeEntry();
            
            		zin.close();
            
            
            
            		return dest;
            
            
            
            	}
            
            
            
            	private void compressDir(File dir, ZipOutputStream zout) throws IOException {
            
            		String[] list = dir.list();
            
            		if (list == null || list.length == 0)
            
            			throw new NullPointerException(dir.getAbsolutePath()
            
            					+ "n'existe pas ou est vide");
            
            		for (String f : list) {
            
            			// System.out.println(f);
            
            			File toZip = new File(dir, f);
            
            			if (toZip.isDirectory()) {
            
            				compressDir(toZip, zout);
            
            				continue;
            
            			}
            
            			ZipEntry ze = new ZipEntry(toZip.getAbsolutePath().substring(
            
            					tozip.getAbsolutePath().length() + 1));
            
            			zout.putNextEntry(ze);
            
            			byte[] buff = new byte[1024];
            
            			FileInputStream fin = new FileInputStream(toZip);
            
            			int read = fin.read(buff);
            
            			while (read > -1) {
            
            				zout.write(buff, 0, read);
            
            				zout.flush();
            
            				read = fin.read(buff);
            
            			}
            
            			zout.closeEntry();
            
            			fin.close();
            
            
            
            		}
            
            
            
            	}
            
            
            
            	private void compressDirJar(File dir, JarOutputStream jout)
            
            			throws IOException {
            
            		String[] list = dir.list();
            
            		if (list == null || list.length == 0)
            
            			throw new NullPointerException(dir.getAbsolutePath()
            
            					+ "n'existe pas ou est vide");
            
            		for (String f : list) {
            
            			// System.out.println(f);
            
            			File toZip = new File(dir, f);
            
            			if (toZip.isDirectory()) {
            
            				compressDirJar(toZip, jout);
            
            				continue;
            
            			}
            
            			JarEntry ze = new JarEntry(toZip.getAbsolutePath().substring(
            
            					tozip.getAbsolutePath().length() + 1));
            
            			jout.putNextEntry(ze);
            
            			byte[] buff = new byte[1024];
            
            			FileInputStream fin = new FileInputStream(toZip);
            
            			int read = fin.read(buff);
            
            			while (read > -1) {
            
            				jout.write(buff, 0, read);
            
            				jout.flush();
            
            				read = fin.read(buff);
            
            			}
            
            			jout.closeEntry();
            
            			fin.close();
            
            
            
            		}
            
            
            
            	}
            
            
            
            	public boolean compress() throws IOException {
            
            		if (!zipfile.exists())
            
            			zipfile.createNewFile();
            
            		ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipfile));
            
            		compressDir(tozip, zos);
            
            		zos.closeEntry();
            
            		zos.close();
            
            		return true;
            
            	}
            
            
            
            	public boolean compressJar() throws IOException {
            
            		if (!zipfile.exists())
            
            			zipfile.createNewFile();
            
            		JarOutputStream jout = new JarOutputStream(
            
            				new FileOutputStream(zipfile));
            
            		compressDirJar(tozip, jout);
            
            		jout.closeEntry();
            
            		jout.close();
            
            		return true;
            
            	}
            
            }
            
            • Partager sur Facebook
            • Partager sur Twitter
              27 octobre 2008 à 22:26:09

              J'avais essayer en testant le dernier caractéres mais cela ne focntionnait pas avec le Type File. Par contre j'ai testé en laissant le chemin en String et it's good :D:D

              Merci à vous tous pour les réponses :D
              • Partager sur Facebook
              • Partager sur Twitter
                27 octobre 2008 à 22:40:11

                ZipEntry ze;

                while ((ze = zin.getNextEntry()) != null) {

                if (ze.isDirectory()) {


                c'est quand meme plus propre que tester des chaines de caractere
                • Partager sur Facebook
                • Partager sur Twitter
                  28 octobre 2008 à 9:30:26

                  Bon nouveau probléme, si un des fichiers comporte un accent, le traitement plante lamentablement à cette endroit
                  is = new BufferedInputStream(zipfile.getInputStream(entry));
                  


                  Existe alors une astuce permettant de gérer les accents ou dois-je obligatoirement remplacer les caractéres spéciaux? Et s'il faut les remplacer, comment le faire pour le entry de type ZipEntry?

                  Merci.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    28 octobre 2008 à 10:41:34

                    C'est quoi l'exception renvoyée ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      28 octobre 2008 à 10:54:06

                      java.io.IOException: Stream closed
                      	at java.io.BufferedInputStream.getInIfOpen(Unknown Source)
                      	at java.io.BufferedInputStream.fill(Unknown Source)
                      	at java.io.BufferedInputStream.read1(Unknown Source)
                      	at java.io.BufferedInputStream.read(Unknown Source)
                      	at Unzip.<init>(Unzip.java:55)
                      	at Fenetre$jButtonValiderListener.actionPerformed(Fenetre.java:184)
                      	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
                      	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
                      	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
                      	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
                      	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
                      	at java.awt.Component.processMouseEvent(Unknown Source)
                      	at javax.swing.JComponent.processMouseEvent(Unknown Source)
                      	at java.awt.Component.processEvent(Unknown Source)
                      	at java.awt.Container.processEvent(Unknown Source)
                      	at java.awt.Component.dispatchEventImpl(Unknown Source)
                      	at java.awt.Container.dispatchEventImpl(Unknown Source)
                      	at java.awt.Component.dispatchEvent(Unknown Source)
                      	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
                      	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
                      	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
                      	at java.awt.Container.dispatchEventImpl(Unknown Source)
                      	at java.awt.Window.dispatchEventImpl(Unknown Source)
                      	at java.awt.Component.dispatchEvent(Unknown Source)
                      	at java.awt.EventQueue.dispatchEvent(Unknown Source)
                      	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
                      	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
                      	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
                      	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
                      	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
                      	at java.awt.EventDispatchThread.run(Unknown Source)
                      
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Dézipper un dossier

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown