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 :

Exécuter un fichier écrit en C


Sujet :

Entrée/Sortie Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 48
    Points : 35
    Points
    35
    Par défaut Exécuter un fichier écrit en C
    Bonjour, je sais que ce sujet à déjà été abordé mais soit aucune solution n'étaient proposé ou alors celles que j'ai essayées n'ont menées à rien.

    Je pourrai presque reprendre mot pour mot ce qui a été dit dans ce topic : http://www.developpez.net/forums/d89...e-partir-java/

    En effet, ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public static void main(String[] args) {
     
            Runtime runtime = Runtime.getRuntime();
            try
            {
                Process process = runtime.exec("c:\\windows\\notepad.exe");
            }
            catch(Exception e)
            {
                System.out.println(e.getMessage());
            }
        }
    Me lance bien notepad.

    Alors que celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public static void main(String[] args) {
     
            Runtime runtime = Runtime.getRuntime();
     
            try
            {
                Process process = runtime.exec("G:\\Vaisseau\\Executable\\Vaisseau.exe");
     
            }
            catch(Exception e)
            {
                System.out.println(e.getMessage());
            }
        }
    Ne lance rien du tout. (Et j'ai vérifier, re-vérifier et re-re-vérifier, le chemin est bon.)

    J'ai alors essayé comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public static void main(String[] args) {
     
            Runtime runtime = Runtime.getRuntime();
            System.setSecurityManager(null);
            try
            {
                ProcessBuilder pB = new ProcessBuilder("G:\\Vaisseau\\Executable\\Vaisseau.exe");
            }
            catch(Exception e)
            {
                System.out.println(e.getMessage());
            }
        }
    Mais rien à faire, rien ne se lance.. Et la grande question est, pourquoi?
    Si quelqu'un sait comment y remédier, je suis preneur..

    Merci d'avance !

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

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

    Informations forums :
    Inscription : Août 2006
    Messages : 4 074
    Points : 7 978
    Points
    7 978
    Par défaut
    Ton programme en C la, il attends une entrée console ou quoi ?
    Comment est tu sûre qu'il a bien lancé ou non le dit programme ?

    note : Avec processBuilder aussi je pense qu'il faut utilisé la méthode start() pour lancé la commande.
    note2 : Attention de consommer les flux avec runtime.exec().

    En cas de doute, voir la FAQ
    (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

  3. #3
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    déjà pour la version avec ProcessBuilder, si tu n'appelles pas start() sur l'instance de ProcessBuilder, c'est normal que ça ne fasse rien.

    Ensuite, passer par Runtime.exec ou ProcessBuilder, c'est (presque) la même chose

    Si tu regardes le code de Runtime.exec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    return new ProcessBuilder(cmdarray)
    	    .environment(envp)
    	    .directory(dir)
    	    .start();
    Donc au final, ça utilises dans les deux cas un ProcessBuilder.

    Maintenant "ne lance rien du tout" est une conclusion qui sort d'où ?

    Peut être que Vaisseau.exe démarre et plante tout de suite ?

    Il faut que tu vérifies s'il n'y a pas d'erreurs d'éxécution : en récupérant la sortie standard (la console) pour ton exe, par et Process.getErrorStream() && Process.getInputStream() .

    Par exemple, en gros, vite fait :

    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
    public static void main(String[] args) {
     
            Runtime runtime = Runtime.getRuntime();
     
            try
            {
                final Process process = runtime.exec("G:\\Vaisseau\\Executable\\Vaisseau.exe");
                Thread thread = new Thread() {
                     public void run() {
                         try ( Reader err = new BufferedReader(new InputStreamReader(process.getErrorStream()) ) {
                             String line;
                               while ((line = err.readLine()) != null) {
                                  System.err.println(line );
                              }
     
                         }
                     }
                }.start(); 
                Thread thread = new Thread() {
                     public void run() {
                         try ( Reader err = new BufferedReader(new InputStreamReader(process.getInputStream()) ) {
                             String line;
                               while ((line = err.readLine()) != null) {
                                  System.out.println(line );
                              }
     
                         }
                     }
                }.start(); 
     
                process.waitFor(); 
     
            }
            catch(Exception e)
            {
                System.out.println(e.getMessage());
            }
        }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 48
    Points : 35
    Points
    35
    Par défaut
    Bonsoir, et merci de vos réponses.

    Tout d'abord,

    Ton programme en C la, il attends une entrée console ou quoi ?
    Non, c'est un simple petit jeu créer avec la SDL (une fenêtre et non pas une console), je comptais rassemblé mes différents jeux créer avec la SDL dans une sorte de "mini-launcher" qui exécuterai un jeu au clic d'un bouton mais pour l'instant j'essaye juste d'en lancer un sans prendre en compte les événements etc..

    Ensuite,

    Maintenant "ne lance rien du tout" est une conclusion qui sort d'où ?

    Peut être que Vaisseau.exe démarre et plante tout de suite ?
    Je ne pense pas que ça soit le cas, car lorsque je lance Vaisseau.exe en allant simplement dans le dossier qui le contient et en faisant un double-clic dessus, celui se lance bien sans un aucun soucis.

    Et enfin, en m'inspirant fort de la FAQ, j'ai remodeler mon code comme ceci :

    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
     public static void main(String[] args) {
     
            Runtime runtime = Runtime.getRuntime();
     
            try 
            {  
                final Process process = runtime.exec("G:\\Vaisseau\\Executable\\Vaisseau.exe");
     
     
     
        // Consommation de la sortie standard de l'application externe dans un Thread separe
             new Thread() 
             {
                public void run() 
                {
                   try 
                   {
                        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
                        String line = "";
                        try 
                        {
                            while((line = reader.readLine()) != null) 
                            {
                                System.out.println(line);
                            }
                        } 
                        finally 
                        {
                            reader.close();
                        }
                    } 
                    catch(IOException ioe) 
                    {
                       ioe.printStackTrace();
                    }
                 }
             }.start();
     
        // Consommation de la sortie d'erreur de l'application externe dans un Thread separe
        new Thread() {
                public void run() {
                        try {
                                BufferedReader reader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
                                String line = "";
                                try {
                                        while((line = reader.readLine()) != null) {
                                                System.out.println(line);
                                        }
                                } finally {
                                        reader.close();
                                }
                        } catch(IOException ioe) {
                                ioe.printStackTrace();
                        }
                }
        }.start();
           }catch(Exception e) {System.out.println(e.getMessage());}
        }
    Mais j'ai la même chose qui se produit, c'est à dire dire que rien ne se lance.. Une fenêtre est censé s'ouvrir mais il ne se passe rien.

    Alors qu'avec ce code aussi, si je met le chemin d'accès vers notepade.exe, mon bloc note s'ouvre bien.. Je ne vois vraiment pas d'où vient le problème. :/

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

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

    Informations forums :
    Inscription : Août 2006
    Messages : 4 074
    Points : 7 978
    Points
    7 978
    Par défaut
    Tu devrais éventuellement mettre une trace (ecriture fichier ou autres) au tout début de ton programme fait en C pour être certain qu'il ne se lance pas puis plante pour une raison x ou y (genre pas le bon working directory et le programme cherche apres un fichier graphique et donc il le trouve pas et bardaf).
    (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 averti
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mars 2005
    Messages : 249
    Points : 349
    Points
    349
    Par défaut
    peut-etre un probleme de working directory? Runtime.exec peut prendre le working dir en paramètre.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 48
    Points : 35
    Points
    35
    Par défaut
    Tu devrais éventuellement mettre une trace (ecriture fichier ou autres) au tout début de ton programme fait en C pour être certain qu'il ne se lance pas puis plante pour une raison x ou y (genre pas le bon working directory et le programme cherche apres un fichier graphique et donc il le trouve pas et bardaf).
    J'ai mit un fprintf dans stderr juste après mes déclaration de variable dans le main de mon programme C et rien ne s'écrit lorsque je lance mon programme java. Par contre mon fichier stdout et stderr s'ouvre (ils sont ouvert mais avec rien d'écrit dedans). Je me dis alors qu'il accède bien jusque là mais ne passe même pas la déclaration de variable?

    peut-etre un probleme de working directory? Runtime.exec peut prendre le working dir en paramètre.
    J'ai essayer de mettre ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    final Process process = runtime.exec( new String[] {"G:\\Vaisseau\\Executable\\Vaisseau.exe", "G:\\Vaisseau\\Executable"});
    Mais rien à faire, il ne se lance pas.. :/

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

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

    Informations forums :
    Inscription : Août 2006
    Messages : 4 074
    Points : 7 978
    Points
    7 978
    Par défaut
    Tu as mis un process.waitFor(); aussi ? (bien qu'en théorie ca devrait marcher sans aussi).
    (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 averti
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mars 2005
    Messages : 249
    Points : 349
    Points
    349
    Par défaut
    Citation Envoyé par Gurdile Voir le message
    J'ai essayer de mettre ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    final Process process = runtime.exec( new String[] {"G:\\Vaisseau\\Executable\\Vaisseau.exe", "G:\\Vaisseau\\Executable"});
    Mais rien à faire, il ne se lance pas.. :/
    C'est pas comme ça pour le working dir, c'est plutot cette version :
    public Process exec(String command,
    String[] envp,
    File dir)
    throws IOException

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 48
    Points : 35
    Points
    35
    Par défaut
    C'est bon ça fonctionne !
    Merci à vous 2 !

    En faite c'est la combinaison de ce que vous avez dit qui est la solution, j'avais en effet oublié de mettre un process.waitFor() mais ça ne fonctionnait quand même pas si je ne mettais pas mon code comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    File vaisseau = new File("G:\\Vaisseau\\Executable");
                final Process process = runtime.exec("G:\\Vaisseau\\Executable\\Vaisseau.exe", new String [] {""}, vaisseau);
                process.waitFor();
    Encore merci de m'avoir aidé !

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

Discussions similaires

  1. Exécuter un fichier .BAT sur une machine distante
    Par ruff15 dans le forum Windows
    Réponses: 4
    Dernier message: 14/09/2005, 11h44
  2. Commande MS DOS qui exécute un fichier C++.
    Par Furius dans le forum C++
    Réponses: 5
    Dernier message: 09/09/2005, 17h42
  3. Exécuter un fichier .sql
    Par joul's dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/02/2005, 12h18
  4. Exécuter un fichier à partir du code
    Par TheCool dans le forum ASP
    Réponses: 28
    Dernier message: 18/01/2005, 19h22
  5. exécution des fichiers index.php
    Par berry dans le forum Apache
    Réponses: 4
    Dernier message: 20/12/2004, 20h29

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