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

Langage Java Discussion :

Problème pour zipper (7Zip).


Sujet :

Langage Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Par défaut Problème pour zipper (7Zip).
    Bonjour,

    Je suis en train de créer un application qui gère les fichiers .zip
    Au début j'avais employé un algorithme trouvé sur le web assez long qui s'occupait de la compression et de la décompression.

    Mais je me suis dis, pourquoi ne pas utiliser 7Zip qui peut se lancer par ligne de commande. Ca réduira la longueur du code et je pourrais utiliser la puissance du logiciel pour plus de fiabilité.

    Je souhaite compresser un fichier.

    Voici le simple code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    private static String sevenZip = "\"C:/Program Files/7-Zip/7z.exe\"";
     
    public static void compress(final File file, final File target) 
    {
    String cmd = "cmd /c " + sevenZip + " a -tzip " + target + " " + file;
     
    System.out.println(cmd);
    try {
    		 Runtime.getRuntime().exec(cmd);
    		}catch(Exception e) {
    		System.out.println("erreur d'execution " + cmd + e.toString());
    	} 
    }

    Le problème :


    J'utilise des chemins absolus.
    Lorsque c'est un chemin simple et que la commande est du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "cmd /c "C:/Program Files/7-Zip/7z.exe" a -tzip C:\Users\MyDocuments\archive.zip C:\Users\MyDocuments\dossierAZipper"
    ça fonctionne.

    Cependant reste un problème au niveau des espaces. Si la commande générer est du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "cmd /c "C:/Program Files/7-Zip/7z.exe" a -tzip C:\Users\MyDocuments\mon archive.zip C:\Users\MyDocuments\dossierAZipper"
    ça me créera un dossier mon.zip donc ce n'est pas ce que je souhaite.

    Si je rajoute des doubles cotes de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String cmd = "cmd /c " + sevenZip + " a -tzip \"" + target + "\" \"" + file + "\"";
    Ça ne fonctionne pas. Aucun zippage n'est effectué ! Il ne se passe rien.
    Ce qui est étrange c'est que dans le DOS, lorsque j'exécute une commande du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "C:/Program Files/7-Zip/7z.exe" a -tzip "C:/Users/MyDocuments/mon archive.zip" "C:/Users/MyDocuments/dossierAZipper"
    Ça fonctionne.

    Donc finalement je ne comprends pas pourquoi ça ne fonctionne pas lorsque je rajoute les doubles cotes ?
    A noter que j'ai aussi remplacé '\' par '/', les résultats sont les même partout.

    Une idée pour me permettre d'effectuer mes compressions ?

  2. #2
    Inactif  
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    885
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 885
    Par défaut
    Salut,

    as-tu essayé la version :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public Process exec(String[] cmdarray)
    plutôt que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public Process exec(String command)
    ?
    Histoire de passer les paramètres proprement.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Par défaut
    Oui, j'ai essayé ces deux synthaxes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String param[] = {"cmd", "/c", sevenZip, "a", "-tzip", "\"" + target.getAbsolutePath() + "\"", "\"" + file.getAbsolutePath() + "\""};
    Ne fait rien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String param[] = {"cmd", "/c", sevenZip, "a", "-tzip", target.getAbsolutePath(), file.getAbsolutePath()};
    Le compressage ne s'effectue que sur des chemins sans espace.

  4. #4
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 698
    Par défaut
    Normalement cela revrait fonctionner avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String param[] = {"cmd", "/c", sevenZip, "a", "-tzip", target.getAbsolutePath(), file.getAbsolutePath() };
    Par contre il vaudrait mieux utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private static String sevenZip = "C:\\Program Files\\7-Zip\\7z.exe";
    Sinon penses aussi à lire les flux de sortie standard et d'erreur standard pour récupérer les messages d'erreur et aussi pour éviter, que l'application se bloque si le tampon de ces flux est saturé.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Par défaut
    Changer '/' par '\\' ne modifie pas les résultats.

    Peux-tu m'indiquer comment récupérer ce qui est sensé s'afficher sur la console DOS pour voir si la commande génère une erreur ?

    Car c'est vrai que je n'ai pour me guider que ce qui se passe à l'écran.

  6. #6
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 698
    Par défaut
    Les message sont envoyés sur les flux de sortie(enfin entrée du coté de l'application java) et d'erreur standard.
    Tu peux aller voir dans http://www.developpez.net/forums/d75...m/#post4386659

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Par défaut
    Merci, j'ai pu récupérer le flux.
    Par contre l'erreur est des plus étrange.

    Premier test en donnant un nom de fichier sans espace, ça marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    cmd /c C:/Program Files/7-Zip/7z.exe a -tzip C:\Users\M4veR1K\Documents\aaa.zip C:\Users\M4veR1K\Documents\lol
     
    7-Zip 4.65  Copyright (c) 1999-2009 Igor Pavlov  2009-02-03
    Scanning
     
    Creating archive C:\Users\M4veR1K\Documents\aaa.zip
     
     
    Everything is Ok
    Deuxième test en donnant un nom de fichier avec espace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cmd /c C:/Program Files/7-Zip/7z.exe a -tzip C:\Users\M4veR1K\Documents\a aa.zip C:\Users\M4veR1K\Documents\lol
    'C:/Program' n'est pas reconnu en tant que commande interne
    ou externe, un programme ex‚cutable ou un fichier de commandes.
    Toujours avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String param[] = {"cmd", "/c", sevenZip, "a", "-tzip", target.getAbsolutePath(), file.getAbsolutePath()};
    J'ai de nouveau remplacé les '/' par '\\' .

    J'ai aussi rajouté des guillemets à sevenPath, et aussi aux fichiers de la liste des arguments de la manière suivante :
    "\"" + file.getAbsoluteFile() + "\"" .
    Mais j'ai bien l'impression qu'il ne supporte pas ça. On a direct l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'C:/Program' n'est pas reconnu en tant que commande interne
    ou externe, un programme ex‚cutable ou un fichier de commandes.

  8. #8
    Inactif  
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    885
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 885
    Par défaut
    Question bête : pourquoi utiliser "cmd" pour lancer une appli ? Tu peux lancer directement l'appli par son nom.
    Tout ça pour dire qu'un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Runtime.getRuntime().exec(new String[]{
                "\"C:\\Program Files\\7-Zip\\7z.exe\"",
                "a",
                "-tzip",
                "\"C:\\Canard PC\\le magajine des zeux video.zip\"",
                "\"C:\\Eclipse j aime pas\\vive NetBeans\\*\""
                });
    fonctionne très bien

    et il n'y a aucun message subliminal...

  9. #9
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 698
    Par défaut
    En effet "cmd /c" est utile si on veut utiliser un script .bat ou une commande système windows comme copy, attrib, net, start ...
    Dans son cas, il ne sert absolument a rien a part compliquer les choses étant donné que 7z.exe est déjà un exécutable.
    Il me semble même que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Runtime.getRuntime().exec(new String[]{
                "C:\\Program Files\\7-Zip\\7z.exe",
                "a",
                "-tzip",
                "C:\\Canard PC\\le magajine des zeux video.zip",
                "C:\\Eclipse j aime pas\\vive NetBeans\\*"
                });
    devrait suffire

  10. #10
    Inactif  
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    885
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 885
    Par défaut
    nan, il faut entourer de double quotes les chemins contenant des espaces.
    cf la doc de 7zip (section "Command line syntax") :
    Wildcards or filenames with spaces must be quoted:

    "Dir\Program files\*"
    Dir\"Program files"\*

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Par défaut
    Merci les gars, le problème était bien la. C'est bon à savoir =)

    Solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String param[] = {sevenZip, "a", "-tzip", "\"" + target.getAbsolutePath() + "\"", "\"" + file.getAbsolutePath() + "\""};
    Note : Si on met pas les doubles cotes, le fichier zip est bien créé, mais est vide.

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

Discussions similaires

  1. Problème pour Zipper des fichiers en cascade,
    Par Johan_VBA dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 27/09/2012, 17h43
  2. Problème pour zipper un fichier
    Par Coin dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 25/08/2007, 10h29
  3. Problème pour Zipper en ASP
    Par Marconico dans le forum ASP
    Réponses: 7
    Dernier message: 13/03/2007, 10h44
  4. Réponses: 3
    Dernier message: 29/08/2003, 10h57
  5. Problème pour récupérer la clé primaire
    Par caramel dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 11/04/2003, 13h57

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