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

Java Discussion :

Dézipper une archive zip


Sujet :

Java

  1. #1
    Membre régulier Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2016
    Messages : 189
    Points : 81
    Points
    81
    Par défaut Dézipper une archive zip
    Bonjour,
    je vous explique mon problème :
    j'ai une fonction qui extraie toutes les archives d'un répertoire (elle marche).
    je suis dans une appli web du coup je l'ai mis dans un Thread pour que l'extraction se lance en asynchrone.
    je voudrais faire un test pour que si dans le dossier qui a été extraite un fichier est supprimé alors j'extraie seulement celui là. mon code marche si un dossier extraite est supprimé mais pas si un fichier du dossier est supprimé.

    je sais pas si je me suis bien exprimé. dans l'état si un dossier est supprimé entre temps et que l'utilisateur actualise la page alors seulement ce dossier est extraite à nouveau. je voudrais que ça fasse la même chose pour les fichiers du dossier extraite.
    donc en gros si un dossier est supprimé alors je l'extraie à nouveau (seulement celui-là)
    et si c'est un fichier qui est supprimé alors je l'extraie à nouveau (seulement ce fichier qui sera dans le bon dossier une fois extraite)

    c'est la fonction qui cherche tous les fichiers (je l'utilise pour chercher toutes les archives du répertoire) :
    Code JAVA : 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
     
        /**
         * Methode qui permet de parser un repertoire et de retrouver ses fichiers
         */
        private static void findFilesRecursively(File file, Collection<File> all, final String extension) {
            // Liste des fichiers correspondant a l'extension souhaitee
            final File[] children = file.listFiles(new FileFilter() {
                public boolean accept(File f) {
                    return f.getName().endsWith(extension);
                }
            }
                );
            if (children != null) {
                // Pour chaque fichier recupere, on appelle a nouveau la methode
                for (File child : children) {
                    all.add(child);
                    findFilesRecursively(child, all, extension);
                }
            }
        }

    c'est la fonction qui permet l'extraction :
    Code JAVA : 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
     
    public void extraireToutZip() {
            byte[] buffer = new byte[1024];
     
            try {
                final Collection<File> all = new ArrayList<File>();
                findFilesRecursively(new File("C:\\Users\\moi\\Desktop\\bilans batch satelit 2016"), all, ".zip");
     
                for (File file : all) {
                    System.out.println(file.getName());
                    ZipInputStream zis = new ZipInputStream(new FileInputStream(file));
                    ZipEntry ze = zis.getNextEntry();
                    while (ze != null) {
                        String fileName = ze.getName();
                        File newFile = new File(file.getParentFile() + File.separator + fileName);
     
                        // je vérifie si le fichier existe déjà pour ne pas l'extraire à nouveau
                        if (!newFile.exists()) {
                            System.out.println("Extraction du fichier : " + newFile.getAbsoluteFile());
                            if (ze.isDirectory()) {
                                String temp = newFile.getCanonicalPath();
                                new File(temp).mkdir();
                            }
                            else {
                                FileOutputStream fos = new FileOutputStream(newFile);
                                int len;
                                while ((len = zis.read(buffer)) > 0) {
                                    fos.write(buffer, 0, len);
                                }
                                fos.close();
                            }
                        }
                        else {
                            System.out.println("Déjà extraite !");
                            break;
                        }
                        ze = zis.getNextEntry();
                    }
                    zis.closeEntry();
                    zis.close();
                    System.out.println("Extraction complétée");
                }
            }
            catch (IOException ex) {
                ex.printStackTrace();
            }
        }

    voilà. dites-moi si vous avez pas compris
    j'espère l'aide de quelqu'un
    merci d'avance

  2. #2
    Membre régulier Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2016
    Messages : 189
    Points : 81
    Points
    81
    Par défaut
    j'ai changé la ligne 18 : j'ai mis un while à la place du if et là ça marche. est-ce qu'on peut faire mieux ? parce qu'il y a 3 boucles while maintenant

    Code JAVA : 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
     
    public void extraireToutZip() {
            byte[] buffer = new byte[1024];
     
            try {
                final Collection<File> all = new ArrayList<File>();
                findFilesRecursively(new File("C:\\Users\\moi\\Desktop\\bilans batch satelit 2016"), all, ".zip");
     
                for (File file : all) {
                    System.out.println(file.getName());
                    ZipInputStream zis = new ZipInputStream(new FileInputStream(file));
                    ZipEntry ze = zis.getNextEntry();
                    while (ze != null) {
                        String fileName = ze.getName();
                        File newFile = new File(file.getParentFile() + File.separator + fileName);
     
                        // je vérifie si le fichier existe déjà pour ne pas l'extraire à nouveau
                        while (!newFile.getAbsoluteFile().exists()) {
                            System.out.println("Extraction du fichier : " + newFile.getAbsoluteFile());
                            if (ze.isDirectory()) {
                                String temp = newFile.getCanonicalPath();
                                new File(temp).mkdir();
                            }
                            else {
                                FileOutputStream fos = new FileOutputStream(newFile);
                                int len;
                                while ((len = zis.read(buffer)) > 0) {
                                    fos.write(buffer, 0, len);
                                }
                                fos.close();
                            }
                            break;
                        }
                        /*else {
                            System.out.println("Déjà extraite !");
                            break;
                        }*/
                        ze = zis.getNextEntry();
                    }
                    zis.closeEntry();
                    zis.close();
                    System.out.println("Extraction complétée");
                }
            }
            catch (IOException ex) {
                ex.printStackTrace();
            }
        }

  3. #3
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    août 2006
    Messages
    4 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : août 2006
    Messages : 4 002
    Points : 7 825
    Points
    7 825
    Par défaut
    Bonjour,

    Changer le if par un while me semble un peu inutile, le if aurait dut rester en place, je ne comprends pas pourquoi tu as fait ça.

    Pareil pour :

    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre régulier Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2016
    Messages : 189
    Points : 81
    Points
    81
    Par défaut
    vu que je ne connais absolument rien sur le parcours de fichiers (surtout pour l'extraction en suite) en JAVA j'ai pris un exemple sur internet en faite.

  5. #5
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    août 2006
    Messages
    4 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : août 2006
    Messages : 4 002
    Points : 7 825
    Points
    7 825
    Par défaut
    Citation Envoyé par Mr.Robot12 Voir le message
    vu que je ne connais absolument rien sur le parcours de fichiers (surtout pour l'extraction en suite) en JAVA j'ai pris un exemple sur internet en faite.
    Et bien il n'est pas bon cet exemple, ces 2 while devraient être des if
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre régulier Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2016
    Messages : 189
    Points : 81
    Points
    81
    Par défaut
    Citation Envoyé par wax78 Voir le message
    Et bien il n'est pas bon cet exemple, ces 2 while devraient être des if
    ah bah merci beaucoup pour la correction

  7. #7
    Membre régulier Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2016
    Messages : 189
    Points : 81
    Points
    81
    Par défaut
    j'ai changé les 2 while en if comme vous avez dis et ça ne marche pas après : la fonction n'extraie plus

  8. #8
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    août 2006
    Messages
    4 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : août 2006
    Messages : 4 002
    Points : 7 825
    Points
    7 825
    Par défaut
    J'ai en effet dit une bêtise pour un des 2 while par inattention.

    Le code d'extraction devrait être :

    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
    // On garde bien ce while.
    		while (ze != null)
    		{
    			String fileName = ze.getName();
    			File newFile = new File(file.getParentFile() + File.separator + fileName);
     
    			// je vérifie si le fichier existe déjà pour ne pas l'extraire à nouveau
    			// ICI UN IF pas un while.
    			if (!newFile.getAbsoluteFile().exists())
    			{
    				System.out.println("Extraction du fichier : " + newFile.getAbsoluteFile());
    				if (ze.isDirectory())
    				{
    					String temp = newFile.getCanonicalPath();
    					new File(temp).mkdir();
    				} else
    				{
    					FileOutputStream fos = new FileOutputStream(newFile);
    					int len;
    					while ((len = zis.read(buffer)) > 0)
    					{
    						fos.write(buffer, 0, len);
    					}
    					fos.close();
    				}
    				break;
    			}
    			/*
    			 * else { System.out.println("Déjà extraite !"); break; }
    			 */
    			ze = zis.getNextEntry();
    		}
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre régulier Avatar de Mr.Robot12
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2016
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2016
    Messages : 189
    Points : 81
    Points
    81
    Par défaut
    justement j'avais mis un if au début mais il ne marchait pas quand c'est un fichier qui est supprimé et non un dossier

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

Discussions similaires

  1. Manipuler une archive zip ou rar
    Par will97 dans le forum Général Python
    Réponses: 1
    Dernier message: 29/09/2007, 08h41
  2. Créer une archive zip
    Par shaun_the_sheep dans le forum Administration système
    Réponses: 3
    Dernier message: 31/03/2007, 22h19
  3. [Zip] Extraire une archive zip sur le serveur
    Par troxsa dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 13/03/2007, 11h15
  4. [Zip] Décompresser une archive zip ou .gz
    Par Invité(e) dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 23/02/2007, 07h33
  5. [C#] [WinForms] Lecture d'un fichier dans une archive ZIP
    Par aegypius dans le forum Windows Forms
    Réponses: 2
    Dernier message: 21/12/2004, 17h15

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