Résolu Java : extraction d'un zip fichiers + dossiers

Alex Fatta

Commandant de la Flotte et de la Horde
13 Août 2014
1 389
1
191
187
Bonjour !

Je reviens ici pour essayer de trouver une solution mon problème sur lequel je galère depuis plusieurs heures sans trouver de réponse.

Bon je cherche à extraire un fichier compressé qui contient des fichiers .jar ou des dossiers contenant eux mêmes des fichiers .jar.

Pour ce faire, j'utilise le code suivante :

Code:
    public static void getZipFiles(String filename) {
        try {
            String destinationname = CheckModPackFolder.getModpackfolderpath();
            byte[] buf = new byte[1024];
            ZipInputStream zipinputstream = null;
            ZipEntry zipentry;
            zipinputstream = new ZipInputStream(new FileInputStream(destinationname + filename));

            zipentry = zipinputstream.getNextEntry();
            while (zipentry != null) {
                //for each entry to be extracted
                String entryName = destinationname + zipentry.getName();
                entryName = entryName.replace('/', File.separatorChar);
                entryName = entryName.replace('\\', File.separatorChar);
                System.out.println("entryname " + entryName);
                int n;
                FileOutputStream fileoutputstream;
                File newFile = new File(entryName);
                if (zipentry.isDirectory()) {
                    if (!newFile.mkdirs()) {
                    }
                    zipentry = zipinputstream.getNextEntry();
                    continue;
                }

                fileoutputstream = new FileOutputStream(entryName);

                while ((n = zipinputstream.read(buf, 0, 1024)) > -1) {
                    fileoutputstream.write(buf, 0, n);
                }

                fileoutputstream.close();
                zipinputstream.closeEntry();
                zipentry = zipinputstream.getNextEntry();

            }//while

            zipinputstream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Sauf que le code plante à l'extraction d'un fichier .jar et je me retrouve avec un FileNotFoundException que je ne parviens pas à résoudre.

Le ZIP se compose de la manière suivante :

Mods:
1.7.10: (dossier)
fichiers JAR. <--Le code plante ici en me disant que le chemin d'accès .../mods/1.7.10/nom_du_jar est introuvable.
ic2: (dossier)
fichiers JAR

Fichiers JAR.

Avec ce code, après exécution de la commande, je n'obtiens qu'un fichier nommé "mods" (sans format) qui fait 0 octets. Je suis bloqué donc je me tourne vers vous en espérant trouver de l'aide :)

Voilà !

AlexFatta
 
Si \.minecraft\Modpack\FeedTheWishS4\mods\ est un fichier, c'est normal qu'il peut pas allez trifouiller un dossier dedans si ce n'est pas un dossier.
Tente de le supprimer le dossier où doit s'extraire les fichiers et relance.
Après si tu nous donnais le dossier où les fichiers sont censées s'extraire sa nous aiderais, car je pense que c'est FeedTheWishS4 mais j'en suis pas sûr.

Je pense que t'as dû créer des fichiers par erreur.
 
Donc en fait je souhaiterai que le ZIP s'extrait dans \.minecraft\Modpack\FeedTheWishS4\mods\ ou mods est le dossier inclus dans le ZIP. Dans le code, avec ou sans création manuelle du dossier, j'ai quand même ce fichier "mods" sans extension qui se crée :/

AlexFatta
 
Supprime ce fichier, et rajoute
Code:
toFolder.mkdirs();

au début style après le buffer.
Normalement sa devrait créer un dossier et non un fichier.
 
Bonjour !

Alors le dossier se crée mais ne reste pas, il est ensuite remplacer par le fameux fichier "mods" :/ Je l'ai placé juste après le buffer mais l'erreur reste la même :/

AlexFatta
 
Bah j'ai test le code il marche nickel, envois-moi ton zip & le chemin vers où il doit s'extraire, que je test en local histoire de pas attendre entre chaque test ^c^

Si jamais il te faut un site pour héberger y'a https://send.firefox.com/, je viens d'appendre que Firefox pouvait servir de site d'upload :3
 
Code:
public static void extract(final File zip, final File toFolder) throws IOException {   
       ZipInputStream istream = new ZipInputStream(new FileInputStream(zip));
       byte[] buffer = new byte[4096];
       toFolder.mkdirs();
       
       ZipEntry entry = istream.getNextEntry();
       while(entry != null) {
           final String fileName = entry.getName();
           final File out = new File(toFolder.getAbsolutePath() + "/" + fileName);
           
           if(entry.isDirectory()) {
               out.mkdirs();
               
               entry = istream.getNextEntry();
               continue;
           }
           
           final FileOutputStream ostream = new FileOutputStream(out);
           
           int len;
           while((len = istream.read(buffer)) > 0) ostream.write(buffer, 0, len);
               
           ostream.close();
           entry = istream.getNextEntry();
       }
           
       istream.close();
   }

Voilà normalement sa marche, j'avais oublié que le ZipEntry pouvait être un dossier, donc il créer un fichier avec le nom du dossier ^c^
J'ai juste ajouté une condition que si c'est un dossier il le créé, puis passe à l'entrée suivante.