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

WinDev Discussion :

Ouvrir un fichier avec une application externe via LanceAppli() [WD14]


Sujet :

WinDev

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2011
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Ouvrir un fichier avec une application externe via LanceAppli()
    Bonjour,

    Je dois faire un petit applet Java capable d'ouvrir un fichier avec une application.

    Sous Windows, je ne rencontre pas de problème.

    En revanche, sous Mac, après de nombreux essais divers et variés, je n'arrive pas à ouvrir le fichier.
    Plus précisément, s'il y a des espaces dans le nom du fichier, rien ne se passe. Et ça fonctionne s'il n'y a pas d'espaces.

    Par exemple:
    LanceAppli("open /Volumes/Dossier/BonjourLeMonde.txt") fonctionne.
    LanceAppli("open /Volumes/Dossier/Bonjour Le Monde.txt") ne fonctionne pas (c'est d'ailleurs un peu normal).

    J'ai bien évidemment essayé de mettre des guillemets un peu partout:
    LanceAppli("open '/Volumes/Dossier/Bonjour Le Monde.txt'") ne fonctionne pas.
    LanceAppli("open ""/Volumes/Dossier/Bonjour Le Monde.txt""") ne fonctionne pas.

    Et des '\' d'échappement pourtant fonctionnels dans le Terminal de Mac OS X:
    LanceAppli("open /Volumes/Dossier/Bonjour\ Le\ Monde.txt") ne fonctionne pas.

    Ce que je ne comprends pas, c'est que je stocke toute la commande à lancer (open + nom du fichier) dans une variable que j'affiche via un Trace() juste avant l’exécution. Si je copie la ligne de Trace et que je la colle dans un terminal, le programme s'ouvre comme il faut.
    De plus, LanceAppli() n'échoue pas (je vérifie son retour), donc le "open" est bien exécute, mais le nom du fichier ne doit pas lui être passé correctement (donc il ne fait rien).

    Il doit y avoir un petit truc auquel je n'ai pas pensé. Ou quelque chose que je dois mal faire. Je sens l'erreur bête...

    Est-ce que quelqu'un aurait une idée de comment résoudre ce problème?

  2. #2
    Membre éprouvé Avatar de miripesage
    Homme Profil pro
    gerant
    Inscrit en
    Novembre 2009
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : gerant
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2009
    Messages : 725
    Points : 1 156
    Points
    1 156
    Par défaut
    Bonjour, peut-être qu'il faut dédoubler les guillemets comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LanceAppli("""open /Volumes/Dossier/Bonjour Le Monde.txt""")

  3. #3
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 344
    Points : 3 860
    Points
    3 860
    Par défaut
    Bonjour,

    Et le LanceAppliAssociée(..) ?

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2011
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par miripesage Voir le message
    Bonjour, peut-être qu'il faut dédoubler les guillemets comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LanceAppli("""open /Volumes/Dossier/Bonjour Le Monde.txt""")
    J'avais pas essayé comme ça, mais ça ne fonctionne pas. Cette fois le LanceAppli échoue en me disant qu'il ne trouve pas le programme "open" (erreur 2). Dommage.

    Citation Envoyé par Lo² Voir le message
    Bonjour,

    Et le LanceAppliAssociée(..) ?
    Si c'était si simple... Il n'est malheureusement pas utilisable en Java.



    Merci quand même.

  5. #5
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 308
    Points : 9 417
    Points
    9 417
    Par défaut
    Ca ne serait pas une question de codage de caractères ? En ascii, c'est 32 (=20 hexa) et sous mac ?

  6. #6
    Membre confirmé Avatar de jimmypage
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 314
    Points : 474
    Points
    474
    Par défaut
    Salut,

    Je ne connais pas du tout Mac mais dans le lanceAppli il ne faut pas mettre le nom de l'appli a lancer ?
    Un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lanceAppli("Terminal.app", """open /Volumes/Dossier/Bonjour Le Monde.txt""")
    ne fonctionnerait pas ?

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2011
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par frenchsting Voir le message
    Ca ne serait pas une question de codage de caractères ? En ascii, c'est 32 (=20 hexa) et sous mac ?
    J'en doute, mais au point où j'en suis autant essayer. Je peux changer ça comment?

    Citation Envoyé par jimmypage Voir le message
    Salut,

    Je ne connais pas du tout Mac mais dans le lanceAppli il ne faut pas mettre le nom de l'appli a lancer ?
    Un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lanceAppli("Terminal.app", """open /Volumes/Dossier/Bonjour Le Monde.txt""")
    ne fonctionnerait pas ?
    C'est bien "open" le programme à ouvrir (/usr/bin/open plus exactement). Terminal.app c'est juste un dossier (la vraie application se trouve dedans, ce qui fait /Applications/Utilities/Terminal.app/Contents/MacOS/Terminal).

    De toute façon, le problème ne viens pas de là. "Open" fonctionne, mais pas avec les noms de fichier à espaces. Et même quand cela échoue, Open s'ouvre, il ne fait juste rien.

    J'imagine que si je pouvais afficher la sortie d'un terminal quand je fais mon LanceAppli, j'aurais droit à un truc du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $> open Documents/Beneath a Steel Sky/beneath_a_steel_sky_manual.pdf        [~]
    The files /Users/fastolph/Documents/Beneath, /Users/fastolph/a, /Users/fastolph/Steel, and /Users/fastolph/Sky/beneath_a_steel_sky_manual.pdf do not exist.

  8. #8
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2002
    Messages
    473
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 473
    Points : 814
    Points
    814
    Par défaut
    Je ne connais pas l'univers mac, donc mon message est peut être tout moisi, mais ne peut on pas utiliser à la place des espaces des caractères que le mac interprète comme des espaces ? Le code html correspondant au caractère " ", par exemple... Non ?

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2011
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par kuranes Voir le message
    Je ne connais pas l'univers mac, donc mon message est peut être tout moisi, mais ne peut on pas utiliser à la place des espaces des caractères que le mac interprète comme des espaces ? Le code html correspondant au caractère " ", par exemple... Non ?
    Bien tenté, mais c'est ce que j'ai essayé de faire avec les '\' avant les espaces. Dans un terminal ça fonctionne, mais pas avec LanceAppli(). Si y'a d'autres combinaisons qui marchent je ne les connais pas.

    Je vais continuer à chercher.

  10. #10
    Membre éprouvé Avatar de miripesage
    Homme Profil pro
    gerant
    Inscrit en
    Novembre 2009
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : gerant
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2009
    Messages : 725
    Points : 1 156
    Points
    1 156
    Par défaut
    Bonjour, et comme çà :

    LanceAppli("open /Volumes/Dossier/'Bonjour Le Monde.txt'")

  11. #11
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    730
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 730
    Points : 1 648
    Points
    1 648
    Par défaut
    Bonjour,

    Je ne pratique pas Java (pas depuis 10 ans), mais il se peut que LanceAppli repose sur :
    http://download.oracle.com/javase/1,...lang.String%29

    Or c'est une version qui se charge de découper la ligne de commande en arguments, et d'après des commentaires trouvés via Google, elle serait bête et méchante, se basant sur les espaces sans possibilité d'escaping.

    La version suivante permet de spécifier explicitement les arguments :
    http://download.oracle.com/javase/1,...tring[]%29

    Si tout ceci est juste, je vous recommande d'écrire votre propre "LanceAppli" en Java (vous pouvez coder en Java dans WinDev).

    PS. Voici un exemple basique de code testé sous WD16 (mais sous Windows, désolé).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public static boolean J_LanceAppli(String sCmd, String sArg1)
    {
    	try {
    		Process p = Runtime.getRuntime().exec(new String[]{sCmd, sArg1});
    		p.waitFor();
    		return true; //p.exitValue();
    	} catch(Throwable t) {
    		return false;
    	}
    }
    et en WL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SI J_LanceAppli("notepad", "toto.txt") ALORS
    	Info("OK")
    SINON
    	Erreur("Erreur")
    FIN
    J'ai l'impression que WD est incapable de passer un String[], ce qui serait assez minable...

    PS2. Attention, si vous exécutez en mode bloquant une appli assez longue a exécuter, il faudra faire mieux que le waitFor() car évidement il ne fait pas les "Multitâche()" en attendant.

  12. #12
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2011
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par miripesage Voir le message
    Bonjour, et comme çà :

    LanceAppli("open /Volumes/Dossier/'Bonjour Le Monde.txt'")
    Comme les autres fois, ça fonctionne dans un Terminal mais pas avec mon applet. J'y ai presque cru sur le moment.

    Citation Envoyé par Hibernatus34 Voir le message
    Si tout ceci est juste, je vous recommande d'écrire votre propre "LanceAppli" en Java (vous pouvez coder en Java dans WinDev).
    J'avais songé à la possibilité de faire ça directement en Java, mais ne connaissant pas du tout le langage, j'ai préféré attendre d'avoir épuisé mes possibilités avec WinDev. On dirait que c'est le cas.

    Merci pour les morceaux de code, ça m'éclaire un peu sur vers où me diriger.
    D'ailleurs, ça a même l'air de fonctionner! Je vais faire des tests plus approfondis pour vérifier. Je mettrais "Résolu" une fois que je me serais assuré que tout fonctionne.

    Merci énormément en tout cas.

  13. #13
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    730
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 730
    Points : 1 648
    Points
    1 648
    Par défaut
    Pour exécuter en non bloquant, il suffit d'enlever la ligne "p.waitFor();".
    The subprocess is not killed when there are no more references to the Process object, but rather the subprocess continues executing asynchronously.

  14. #14
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2011
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Je comprenais pas trop cette histoire de bloquant/non bloquant vu que avec ou sans p.waitFor(); mon Applet se terminait bien comme il faut. Et pis j'ai réalisé que c'était Open qui m'ouvrait Excel, et qu'Open se ferme immédiatement.

    Aucun souci donc. Ça a l'air de fonctionner comme je veux.

    Merci encore.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/01/2015, 11h12
  2. Réponses: 9
    Dernier message: 31/01/2014, 16h55
  3. Comment ouvrir un fichier avec une application java ?
    Par chihaoui_med dans le forum Général Java
    Réponses: 3
    Dernier message: 05/11/2009, 13h58
  4. ouvrir un fichier avec une application avec system() ?
    Par supergrey dans le forum Linux
    Réponses: 7
    Dernier message: 03/05/2008, 09h04
  5. ouvrir un fichier avec une application quelconque
    Par madlozoz dans le forum Windows
    Réponses: 4
    Dernier message: 03/02/2008, 12h41

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