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 :

Problème de Zip ! :/


Sujet :

Entrée/Sortie Java

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 104
    Points : 64
    Points
    64
    Par défaut Problème de Zip ! :/
    Hello,
    je zip un répertoire avec le code suivant :

    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
     
    public static boolean zipper(File repAZip) {
     
            // on déclare le nom du fichier zip -> il correspond au nom du répertoire que l'on veut zipper'
            File zip = new File(rep_colis, getRep_paquet().getName()+".zip");
            try {
                // on ouvre un flux zip vers le fichier zip
                ZipOutputStream flux_zip = new ZipOutputStream(new FileOutputStream(zip));
                // méthode
                flux_zip.setMethod(ZipOutputStream.DEFLATED);
                // niveau de compression
                flux_zip.setLevel(Deflater.BEST_COMPRESSION);
                // on lance la compression de ce répertoire
                zipperRep(repAZip, flux_zip);
                // une fois terminé, on ferme le flux
                flux_zip.close();
                // si on ne trouve pas le fichier
            } catch (FileNotFoundException fileNotFound) {
                return false;
                // si on n'arrive pas à écrire'
            } catch (IOException io) {
                return false;
            }
            // tout s'est bien passé'
            try {
                FileUtils.deleteDirectory(rep_paquet);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            System.out.println(getRep_paquet().getName());
            zip.renameTo(new File(rep_colis, getRep_paquet().getName()));
            return true;
        }
    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
    public static boolean zipperRep(File repertoire, ZipOutputStream flux_zip) {
            String[] listFile = repertoire.list();
            for (String elem : listFile) {
                try {
                    File file = new File(repertoire, elem);
                    if (file.isDirectory()) zipperRep(file, flux_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());
                        flux_zip.putNextEntry(entry);
                        flux_zip.write(bytes);
                        flux_zip.closeEntry();
                    }
                } catch (FileNotFoundException fileNotFound) {} catch (IOException io) {}
            }
            return false;
        }
    que je lance avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    zipper(new File("c:/toto/tata"));
    Mon problème est que je veux zipper le contenu de tata sans avoir les sur-répertoire (toto - tata). Je sais que ça vient de la ligne que j'ai mis en gras, car il récupere le path à partir de la racine.
    Je ne sais pas comment faire :/

    Histoire que ce soit clair, voici la structure du disque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    c:
       /toto
              /tata
                     pouet.zip
                     huhu.doc
                     /genre
                              lol.pdf
    Et j'aimerais retrouver dans mon zip :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    pouet.zip
    huhu.doc
                /genre
                        lol.pdf
    Hors actuellement j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    /toto
           /tata
                  pouet.zip
                  huhu.doc
                  /genre
                           lol.pdf
    Qqun aurait une idée de comment faire ?

    Merci

  2. #2
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    J'ai eu la meme problematique dans un de mes programmes, pour regler le probleme j'ai utilise une variable qui contient le nom du repertoire courant et j'ai une methode recursive qui zippe un repertoire, cette methode recoit en argument une String (le path du rep dans l'archive) et un tableau de File.
    Pour creer le ZipEntry j'utilise path_rep + File.getName().

    Et voila plus de probleme.

    Bulbo

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 104
    Points : 64
    Points
    64
    Par défaut
    Je pensais en effet à qqchose dans ce genre là.
    Je te remercie, je vais voir ça

  4. #4
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 104
    Points : 64
    Points
    64
    Par défaut
    Bon ça m'enerve j'y arrive pas
    Quand y'a des ss-ss-repertoire, je vois pas comment faire

    Tu peux partager ta fonction ?

    Merci

  5. #5
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    Ce n'est pas mon code (de toute facon je n'aurais pas eu le droit de le publier ici) mais un truc rapide base sur le tien et qui devrait fonctionner:

    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
     private void addDirToZip(String anArchPath, File aDir) throws Exception
      {
        if (! aDir.isDirectory())
        {
          throw new Exception(aDir.getPath() + " : not a directory");
        }
     
        File list[] = aDir.listFiles();
     
        for (int ind = 0; ind < list.length; ind++)
        {
          if (list[ind].isDirectory())
          {
            addDirToZip(anArchPath + list[ind].getName() + "/", list[ind]);
          }
          else
          {
            FileInputStream in = new FileInputStream(list[ind]);
            byte[] bytes = new byte[in.available()];
            in.read(bytes);
            in.close();
     
            ZipEntry entry = new ZipEntry(anArchPath + list[ind].getName());
            entry.setTime(list[ind].lastModified());
            flux_zip.putNextEntry(entry);
            flux_zip.write(bytes);
            flux_zip.closeEntry();
          }
        }
      }
    la valeur initiale pour anArchPath est "".

    Bon je l'ai pas tester mais a priori je fait rien de transcendant la dedans donc devrait marcher.

    Bulbo

  6. #6
    Membre actif Avatar de hydraland
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Points : 239
    Points
    239
    Par défaut
    Salut,

    Pourquoi tu n'enlèves pas la chaine "c:/toto/tata" de file.getPath() comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    file.getPath().substring("c:/toto/tata".length());
    Je te laisse écrire une version plus "générique".
    A+
    Hydraland

  7. #7
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 104
    Points : 64
    Points
    64
    Par défaut
    J'ai utilisé la solution de Bulbo et cela fonctionne parfaitement...
    Pour ceux qui veulent :

    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
        /**
         * Fonction pour zipper un répertoire ou un fichier.
         * Cela ne prend pas en compte les répertoires supérieurs à celui que l'on veut zipper (ils n'apparaissent pas dans le zip)
         * @param repAZip répertoire que l'on veut zipper
         * @return vrai si la compression s'est bien déroulée, faux sinon
         * @see addDirToZip
         */
        public static boolean zipper(File repAZip) {
            // nom du fichier zip
            String nameZipFile = new String("pouet");
     
            // on déclare le nom du fichier zip -> il correspond au nom du répertoire que l'on veut zipper'
            File zipFile = new File(rep_colis, nameZipFile+".zip");
            try {
                // on assigne de flux zip au fichier Zip
                ZipOutputStream zipStream = new ZipOutputStream(new FileOutputStream(zipFile));
                // méthode
                zipStream.setMethod(ZipOutputStream.DEFLATED);
                // niveau de compression
                zipStream.setLevel(Deflater.BEST_COMPRESSION);
                // on lance la compression de ce répertoire
                if(repAZip.isDirectory()) {
                    addDirToZip("",repAZip, zipStream);
                }else {
                    // si c'est fichier, on le zip
                    try {
                        FileInputStream in = new FileInputStream(repAZip);
                        byte[] bytes = new byte[in.available()];
                        in.read(bytes); in.close();
                        ZipEntry entry = new ZipEntry(repAZip.getName());
                        entry.setTime(repAZip.lastModified());
                        zipStream.putNextEntry(entry);
                        zipStream.write(bytes);
                        zipStream.closeEntry();
                    } catch (Exception ex) {
                        ex.printStackTrace();
                        System.out.println("Problème lors de la compression du répertoire");
                        return false;
                    }
                }
                // une fois terminé, on ferme le flux
                zipStream.close();
            } catch (Exception ex) {
                ex.printStackTrace();
                return false;
            }
            return true;
        }
     
        private static boolean addDirToZip(String anArchPath, File aDir, ZipOutputStream zipStream) {
     
            File list[] = aDir.listFiles();
            for (int ind = 0; ind < list.length; ind++)  {
                if (list[ind].isDirectory())  {
                    addDirToZip(anArchPath + list[ind].getName() + "/", list[ind], zipStream);
                }else  {
                    try {
                        FileInputStream in = new FileInputStream(list[ind]);
                        byte[] bytes = new byte[in.available()];
                        in.read(bytes); in.close();
                        ZipEntry entry = new ZipEntry(anArchPath + list[ind].getName());
                        entry.setTime(list[ind].lastModified());
                        zipStream.putNextEntry(entry);
                        zipStream.write(bytes);
                        zipStream.closeEntry();
                    } catch (Exception ex) {
                        ex.printStackTrace();
                        System.out.println("Problème lors de la compression du répertoire");
                        return false;
                    }
                }
            }
            return true;
        }
    Merci à tous

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

Discussions similaires

  1. problème java + zip : décompression impossible
    Par Papipen dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 09/04/2015, 15h31
  2. problème création ZIP avec DotNetZip
    Par Lenn0x dans le forum ASP.NET
    Réponses: 5
    Dernier message: 17/11/2010, 20h58
  3. Bizarre de problème 7-zip sous Windows 7 Home Premium 64 bits
    Par annedeblois dans le forum Windows 7
    Réponses: 5
    Dernier message: 14/05/2010, 02h37
  4. Problème de zip
    Par Vikisme dans le forum Langage
    Réponses: 11
    Dernier message: 09/05/2007, 10h09
  5. Problème compression zip
    Par Kara dans le forum Delphi
    Réponses: 2
    Dernier message: 19/07/2006, 09h22

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