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 :

[Système][Runtime] pb exec une commande ls ds runtime


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juillet 2003
    Messages
    407
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 407
    Par défaut [Système][Runtime] pb exec une commande ls ds runtime
    bonjour ,
    je suis sr linux , j'exécute une commande ls simple ds un runtime et tout marche bien (j'affiche bien le résultat)
    mais lorsque j'exécute ls D* rien ne s'affiche !

    je ne comprends pas pkoi

    voilà le bout de code que j'utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    cmd = "ls D* ;";
    System.out.println("commande est : "+cmd);
    Process process = Runtime.getRuntime().exec(cmd); 
    BufferedReader ds  = new BufferedReader (new InputStreamReader(process.getInputStream()));
     
    while ((line = ds.readLine()) != null) {
        System.out.println("line result est : "+line);
    }
    ds.close();
    merci

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Quelques remarques :
    • Tu ne lis pas le flux d'erreur, et tu ne peux pas voir les eventuelles erreurs renvoyé par "ls". Si tu utilises Java 5.0 tu peux utiliser ProcessBuilder pour regrouper les flux stdout et stderr dans un seul... Sinon il faut que tu les lises en parallèle pour éviter les interblocages. Voir ce message pour plus de détail : http://www.developpez.net/forums/vie...570460#2570460
    • Les caractères génériques *? sont interprétés de manière différentes selon les shells :
      [list:b7fd7a59c3]
    • Sous Windows ils sont passé tel quel au programme, qui se chargera alors de les interpréter.
    • Sous Unix/Linux, c'est le shell qui les interprètes et qui les remplace par les noms de fichier correspondant avant d'exécuter la commande. Donc les programmes qu monde Unix/Linux ne gère pas les caractères spéciaux puisque c'est déjà fait.

    Or Runtime.exec() lance une application sans passer par le shell donc il passe les paramètres tels quel...
    [*] Pour les mêmes raison (pas de shell), le caractère ";" est passé tels quel et ne correspond pas à une fin de commande mais à un paramètre...[/list:u:b7fd7a59c3]

    En fait si tu lis le flux d'erreur tu devrais y trouver quelques chose du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ls: D*: Aucun fichier ou répertoire de ce type
    ls: ;: Aucun fichier ou répertoire de ce type

    Si tu veux vraiment appeller la commande ls comme cela, il te faut passer par le shell :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cmd = "/bin/sh -c \"ls E* ;\"";
    System.out.println("commande est : "+cmd);
    Process process = Runtime.getRuntime().exec(cmd);
    Maintenant si ton but est de lister les fichiers, il serait préférable de passer par les méthodes adéquates de la classe File (et au moins tu restes multiplateforme...)

    a++

  3. #3
    Membre éclairé
    Inscrit en
    Juillet 2003
    Messages
    407
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 407
    Par défaut
    bonjour ,

    le but n'est pas de lister ce que contient le repertoire ,
    je dois récupérer le nbr de fichiers dont le nom contient des chaines particulières , donc ma commande réélle est sous cette forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmd = "ls /home/Dir"+chaine+"*_log_"+an+"* |wc -l ;";
    et puis la commande n'est pas unique , elle est dynamique selon une chaine passée 'chaine'
    vraiment je sèche
    mais le code que tu m'as passé ne marche pas aussi
    cmd = "/bin/sh -c \"ls E* ;\"";
    System.out.println("commande est : "+cmd);
    Process process = Runtime.getRuntime().exec(cmd);

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par peppena
    bonjour ,

    le but n'est pas de lister ce que contient le repertoire ,
    je dois récupérer le nbr de fichiers dont le nom contient des chaines particulières , donc ma commande réélle est sous cette forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                      cmd = "ls /home/Dir"+chaine+"*_log_"+an+"* |wc -l ;";
    Justement. Tu peux très bien utiliser la méthode File.list(FilenameFilter) pour cela...


    Citation Envoyé par peppena
    mais le code que tu m'as passé ne marche pas aussi
    cmd = "/bin/sh -c \"ls E* ;\"";
    System.out.println("commande est : "+cmd);
    Process process = Runtime.getRuntime().exec(cmd);
    C'est à dire ? Quel est l'erreur ? Tu lis bien le flux d'erreur en sortie de la commande ???

    a++

  5. #5
    Membre éclairé
    Inscrit en
    Juillet 2003
    Messages
    407
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 407
    Par défaut
    la commande retourne null null pas d'erreur ni de résultat ,
    j'ai l'impression que son exécution n'a pas eu lieu

  6. #6
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Comment ca null ? Je ne vois pas ce qui peut te renvoyer null là dedans !

    On pourrait voir le code exact ???

  7. #7
    Membre éclairé
    Inscrit en
    Juillet 2003
    Messages
    407
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 407
    Par défaut
    voilà tout le code :
    ds l'affichage ca me renvoit null , il n'entre meme pas ds la boucle d'affichage de ds.readline ...


    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
     
    String an =  Integer.toString(year) ;
    an = an.substring(2); 
    String mois = Integer.toString(month) ; 
     int nbrfile = 0;
                     String line ;   
                     for(int i=1 ; i <= month ; i++ )
                     {
                    if (i.length() < 2)
                    i = "0"+i ;
                     String cmd = null ;
                      cmd = "/bin/sh -c \"/home/Dir/"+chaine+"*_log_"+an+"* |wc -l  ;\""; 
                      System.out.println("commande est : "+cmd);
                      Process process = Runtime.getRuntime().exec(cmd); 
                      BufferedReader ds  = new BufferedReader (new InputStreamReader(process.getInputStream()));
     
                      while ((line = ds.readLine()) != null) {
                           nbrfile = line ;
                           System.out.println("line est "+line);
                     }
                     ds.close(); 
     
     
                      System.out.println("mle nbr de file log pour l'an "+an+"  est  : "+nbrfile); 
                    }

    merci

  8. #8
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Désolé mais ton code ne compile même pas chez moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (i.length() < 2)
                    i = "0"+i ;
    i est un int !

    nbrfile est un int et line une String !!


    Ensuite tu ne lit toujours pas le flux d'erreur de ton Process, comme je te l'ai indiqué dans mon premier message...

    Enfin il n'y a pas de "ls" dans ta commande...

    a++

  9. #9
    Membre éclairé
    Inscrit en
    Juillet 2003
    Messages
    407
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 407
    Par défaut
    désolée c juste des fautes de frappes ,

    voilà le bout de code du runtime
    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
     
     
    String an =  Integer.toString(year) ;
    an = an.substring(2);
    String mois = Integer.toString(month) ;
    String nbrfile = null;
    String cmd = null ;
    String line ;   
              for(int i=1 ; i <= month ; i++ )
                {
                   cmd = "/bin/sh -c \"ls /home/Dir/"+chaine+"*_log_"+an+"* |wc -l  ;\"";
                   System.out.println("commande est : "+cmd);
                   Process process = Runtime.getRuntime().exec(cmd);
                   BufferedReader ds  = new BufferedReader (new InputStreamReader(process.getInputStream()));
     
                   while ((line = ds.readLine()) != null)
                    {
                       nbrfile = line ;
                       System.out.println("line est "+line);
                     }
                     ds.close();
     
                      System.out.println("le nbr de file log pour l'an "+an+"  est  : "+nbrfile);
             }
    mais je ne sais pas comment lire le flux d'erreur en sortie de la commande ???

  10. #10
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    Pourquoi ne pas utiliser File.list(FilenameFilter) comme adIguba l'a proposé?

    Sa solution est vraiment très simple et elle est multi-platforme. ;-)

    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
     
    /*
     * Created on 30.11.2004
     *
     * To change the template for this generated file go to
     * Window>Preferences>Java>Code Generation>Code and Comments
     */
     
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.FilenameFilter;
     
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
     
     
    /**
     * @author marfab001
     * 
     * To change the template for this generated type comment go to
     * Window>Preferences>Java>Code Generation>Code and Comments
     */
    public class Test {
     
        public static void main(String[] args) throws Exception {
            File file = new File("C:\\projects");
            String[] files;
     
            RegExFilenameFilter filter = new RegExFilenameFilter("*.txt");
            files = file.list(filter);
            System.out.println(" " + files.length);
     
        }
    }
     
    class RegExFilenameFilter implements FilenameFilter {
     
        private Pattern pattern;
     
        public RegExFilenameFilter(String regex) {
            pattern = Pattern.compile(buildRegEx(regex));
        }
     
        public boolean accept(File dir, String name) {
            return pattern.matcher(name).matches();
        }
     
        /* Algo: un peu simplet à améliorer */
        private String buildRegEx(String regex) {
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < regex.length(); ++i) {
               char c = regex.charAt(i);
               if (c == '*') {
                  sb.append(".*");
               }
               else if (c == '.') {
                  sb.append("\\.");
               }
               else {
                  sb.append(c);
               }
            }
            sb.insert(0, "^");
            sb.append("$");
            return sb.toString();
        }
    }

  11. #11
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par peppena
    mais je ne sais pas comment lire le flux d'erreur en sortie de la commande ???
    getErrorStream()... à lire en parallèle de getInputStream()... comme je l'indique dans le lien de mon premier message !!!

    Citation Envoyé par adiGuba
    Enfin il n'y a pas de "ls" dans ta commande...
    Je me demande si tu lis mes messages en entier...

    a++

  12. #12
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jowo
    Sa solution est vraiment très simple et elle est multi-platforme. ;-)
    +1 et une suggestion pour buildRegEx() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        private String buildRegEx(String regex) {
            return  "^" +
                // On entoure le tout par \Q et \E pour éviter l'interprétation des caractères
                quote(regex)
            	// On ferme/ouvre les \Q \E autour des * et ? --> .* .?
            	.replaceAll("[*?]","\\\\E.$0\\\\Q")
            	// On supprime les \Q\E inutile
            	.replaceAll("\\\\Q\\\\E","")
            	+ "$";
        }
    Cela permet de ne prendre en compte que les ? * des expressions du shell dans la génération de l'expression régulière. Cela permet de ne pas avoir de conflit avec d'éventuelle caractères spéciaux que l'on aurait pas traité (du style un "$" dans le nom du fichier...)

    Plus d'info sur Pattern.quote() dans la FAQ : Comment empêcher les expressions régulières d'interpréter une sous-chaînes ?

    a++

    [edit] correction du lien

  13. #13
    Membre éclairé
    Inscrit en
    Juillet 2003
    Messages
    407
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 407
    Par défaut
    ne te fache pas adiGuba
    je t'assure que j'ai tout lu
    et je vais prendre le tps pour tout relire et tester

Discussions similaires

  1. Runtime.getRuntime().exec(command) à partir d'une servlet
    Par cotede2 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 04/05/2009, 16h26
  2. [Runtime]exec d'une commande DOS
    Par fidififouille dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 12/10/2005, 16h50
  3. [System][EXEC] Probleme d'execution avec une commande parametrée.
    Par chicorico dans le forum Général Java
    Réponses: 15
    Dernier message: 20/05/2005, 15h07
  4. [Runtime]exec() avec une commande paramétrée
    Par nice dans le forum Général Java
    Réponses: 9
    Dernier message: 12/05/2005, 13h15
  5. Réponses: 3
    Dernier message: 22/10/2004, 12h04

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