 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Toto Guest
|
Posted: Wed May 26, 2004 12:00 pm Post subject: Récupérer le PATH de mon application |
|
|
Bonjour,
je cherche à pouvoir récupérer le PATH complet de mon application en
utilisant les librairies standard du C++.
En gros, si je suis dans /home/user et que je lance ./dossier/monAppli,
j'aimerais récupérer /home/user/dossier/monAppli
Si vous aviez une idée... :-)
Bien cordialement,
Valentin
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Wed May 26, 2004 12:08 pm Post subject: Re: Récupérer le PATH de mon application |
|
|
On Wed, 26 May 2004 14:00:15 +0200, Toto <toto (AT) toto (DOT) com> wrote:
| Quote: | En gros, si je suis dans /home/user et que je lance ./dossier/monAppli,
j'aimerais récupérer /home/user/dossier/monAppli
|
Parser argv[0] ne suffit pas ?
--
FLL, Epagneul Breton
|
|
| Back to top |
|
 |
Toto Guest
|
Posted: Wed May 26, 2004 12:21 pm Post subject: Re: Récupérer le PATH de mon application |
|
|
Fabien LE LEZ wrote:
| Quote: | On Wed, 26 May 2004 14:00:15 +0200, Toto <toto (AT) toto (DOT) com> wrote:
En gros, si je suis dans /home/user et que je lance ./dossier/monAppli,
j'aimerais récupérer /home/user/dossier/monAppli
Parser argv[0] ne suffit pas ?
|
Non cela ne me donne que ./dosser/monAppli
:-/
|
|
| Back to top |
|
 |
Franck Guillaud Guest
|
Posted: Wed May 26, 2004 12:25 pm Post subject: Re: Récupérer le PATH de mon application |
|
|
Toto wrote:
| Quote: | Fabien LE LEZ wrote:
On Wed, 26 May 2004 14:00:15 +0200, Toto <toto (AT) toto (DOT) com> wrote:
En gros, si je suis dans /home/user et que je lance
./dossier/monAppli, j'aimerais récupérer /home/user/dossier/monAppli
Parser argv[0] ne suffit pas ?
Non cela ne me donne que ./dosser/monAppli
|
Et si jamais tu as un racourci de /toto/titi/tata vers
/home/user/dossier/monAppli, Tu veux récupérer quoi comme chemin :
- /toto/titi/tata
ou
- /home/user/dossier/monAppli ?
Cette simple question pour dire que sous unix et affiliés, la notion de
chemin d'un exécutable n'a pas bcp sens.
En plus, c'est HS :-)
Franck,e-
|
|
| Back to top |
|
 |
Toto Guest
|
Posted: Wed May 26, 2004 12:36 pm Post subject: Re: Récupérer le PATH de mon application |
|
|
Franck Guillaud wrote:
| Quote: | Toto wrote:
Fabien LE LEZ wrote:
On Wed, 26 May 2004 14:00:15 +0200, Toto <toto (AT) toto (DOT) com> wrote:
En gros, si je suis dans /home/user et que je lance
./dossier/monAppli, j'aimerais récupérer /home/user/dossier/monAppli
Parser argv[0] ne suffit pas ?
Non cela ne me donne que ./dosser/monAppli
Et si jamais tu as un racourci de /toto/titi/tata vers
/home/user/dossier/monAppli, Tu veux récupérer quoi comme chemin :
- /toto/titi/tata
ou
- /home/user/dossier/monAppli ?
Cette simple question pour dire que sous unix et affiliés, la notion de
chemin d'un exécutable n'a pas bcp sens.
En plus, c'est HS :-)
Franck,e-
|
Plutot le 2ème cas mais bon ca serait pas dérangeant :-)
C'est po hors sujet j'aimerais le faire en C++ :-D
Valentin
|
|
| Back to top |
|
 |
Jean-Marc Bourguet Guest
|
|
| Back to top |
|
 |
drkm Guest
|
Posted: Wed May 26, 2004 1:30 pm Post subject: Re: Récupérer le PATH de mon application |
|
|
Toto <toto (AT) toto (DOT) com> writes:
| Quote: | En gros, si je suis dans /home/user et que je lance
./dossier/monAppli, j'aimerais récupérer /home/user/dossier/monAppli
Si vous aviez une idée...
|
La « Boost Filesystem Library » ? C'est beaucoup plus large que la
simple récupération du répertoire courant, mais elle peut t'intéresser
si tu fait d'autres manipulations en rapport avec le FS. Tu la
trouveras à <URL:http://www.boost.org/libs/filesystem/doc/index.htm>.
Mais s'il s'agit juste de récupérer le nom du répertoire courant,
dans un programme destiné à une seule plate-forme, un appel à l'API de
ton OS sera plus simple, si tu l'encapsules comme il faut.
--drkm
|
|
| Back to top |
|
 |
Toto Guest
|
Posted: Wed May 26, 2004 1:37 pm Post subject: Re: Récupérer le PATH de mon application |
|
|
drkm wrote:
| Quote: | Toto <toto (AT) toto (DOT) com> writes:
En gros, si je suis dans /home/user et que je lance
./dossier/monAppli, j'aimerais récupérer /home/user/dossier/monAppli
Si vous aviez une idée... :-)
La « Boost Filesystem Library » ? C'est beaucoup plus large que la
simple récupération du répertoire courant, mais elle peut t'intéresser
si tu fait d'autres manipulations en rapport avec le FS. Tu la
trouveras à <URL:http://www.boost.org/libs/filesystem/doc/index.htm>.
Mais s'il s'agit juste de récupérer le nom du répertoire courant,
dans un programme destiné à une seule plate-forme, un appel à l'API de
ton OS sera plus simple, si tu l'encapsules comme il faut.
--drkm
|
je vais voir merci :-)
Le programme n'est pas destiné à qu'une seule plateforme malheureusement
:-/
Valentin
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Wed May 26, 2004 5:07 pm Post subject: Re: Récupérer le PATH de mon application |
|
|
On Wed, 26 May 2004 15:37:23 +0200, Toto <toto (AT) toto (DOT) com> wrote:
| Quote: | Le programme n'est pas destiné à qu'une seule plateforme malheureusement
:-/
|
Dans ce cas, généralement on regroupe les wrappers vers les fonctions
spécifiques à l'OS dans un module, et une version de ce module par OS.
--
FLL, Epagneul Breton
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Thu May 27, 2004 7:50 am Post subject: Re: Récupérer le PATH de mon applic ation |
|
|
Franck Guillaud <f_point_guillaud (AT) free (DOT) fr> wrote
| Quote: | Toto wrote:
Fabien LE LEZ wrote:
On Wed, 26 May 2004 14:00:15 +0200, Toto <toto (AT) toto (DOT) com> wrote:
En gros, si je suis dans /home/user et que je lance
./dossier/monAppli, j'aimerais récupérer /home/user/dossier/monAppli
Parser argv[0] ne suffit pas ?
Non cela ne me donne que ./dosser/monAppli
Et si jamais tu as un racourci de /toto/titi/tata vers
/home/user/dossier/monAppli, Tu veux récupérer quoi comme chemin :
- /toto/titi/tata
ou
- /home/user/dossier/monAppli ?
Cette simple question pour dire que sous unix et affiliés, la notion
de chemin d'un exécutable n'a pas bcp sens.
|
Le SE a toujours suivi un chemin précis pour trouver le programme. On
pourrait dire que c'est le chemin. La plupart du temps, quand on veut le
chemin, c'est pour trouver d'autres fichiers qui sont censés se trouver
dans le même répertoire. Dans ce cas-là, évidemment, les deux chemins se
valent.
| Quote: | En plus, c'est HS
|
Pas du tout. Il a posé bien une question C++.
Malheureusement, la réponse est : ce n'est pas possible.
Qu'il démande précisement pour Unix ou pour Windows, on pourrait dire
que la question était HS. (Malheureusement pour lui, autant que je
sache, la réponse dans les deux cas reste la même. Il y a peut-être une
requête Windows particulière que je ne connais pas, mais je sais que
sous Unix, ce n'est pas possible. Au moins, pas dans le cas général ;
selon le shell qui l'a invoqué, on pourrait dans certains cas y
parvenir.)
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Thu May 27, 2004 8:20 am Post subject: Re: Récupérer le PATH de mon application |
|
|
Fabien LE LEZ <gramster (AT) gramster (DOT) com> wrote
| Quote: | On Wed, 26 May 2004 14:00:15 +0200, Toto <toto (AT) toto (DOT) com> wrote:
En gros, si je suis dans /home/user et que je lance
./dossier/monAppli, j'aimerais récupérer /home/user/dossier/monAppli
Parser argv[0] ne suffit pas ?
|
Selon la norme, argv[0] doit contenir le nom du programme, non le chemin
de l'executable. Comment le système trouve l'executable à partir du nom
dépend du système -- sous Unix, par exemple, tu pourrais essayer de lire
$PATH, puis émuler ce que fait le système.
Dans la pratique, argv[0] est à peu près n'importe quoi. Sous Unix, par
exemple, c'est ce que le programme qui t'invoque décide à te passer --
si c'est un shell classique, ça serait soit le nom, soit le chemin,
selon le shell, mais si ce n'est pas un shell, ça peut être à peu près
n'importe quoi.
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Thu May 27, 2004 8:24 am Post subject: Re: Récupérer le PATH de mon application |
|
|
Fabien LE LEZ <gramster (AT) gramster (DOT) com> wrote
| Quote: | On Wed, 26 May 2004 14:00:15 +0200, Toto <toto (AT) toto (DOT) com> wrote:
En gros, si je suis dans /home/user et que je lance
./dossier/monAppli, j'aimerais récupérer /home/user/dossier/monAppli
Parser argv[0] ne suffit pas ?
|
Selon la norme, argv[0] doit contenir le nom du programme, non le chemin
de l'executable. Comment le système trouve l'executable à partir du nom
dépend du système -- sous Unix, par exemple, tu pourrais essayer de lire
$PATH, puis émuler ce que fait le système.
Dans la pratique, argv[0] est à peu près n'importe quoi. Sous Unix, par
exemple, c'est ce que le programme qui t'invoque décide à te passer --
si c'est un shell classique, ça serait soit le nom, soit le chemin,
selon le shell, mais si ce n'est pas un shell, ça peut être à peu près
n'importe quoi.
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
Loïc Joly Guest
|
Posted: Thu May 27, 2004 11:19 pm Post subject: Re: Récupérer le PATH de mon application |
|
|
[email]kanze (AT) gabi-soft (DOT) fr[/email] wrote:
| Quote: |
Selon la norme, argv[0] doit contenir le nom du programme, non le chemin
de l'executable.
|
Je préciserai en tant que nom du programme : Il s'agit du nom utilisé
pour invoquer le programme, et non pas d'un nom venu d'ailleur. Quand on
lance gcc, il n'y a pas dans argv[0] la chaine "The GNU Compiler
Collection". En plus, il est tout à fait légal d'avoir un argv[0] vide
(voire même pas de argv[0]) :
If argc is nonzero these arguments shall be supplied in argv[0] through
argv[argc1] as pointers to the initial characters of nullterminated
multibyte strings (NTMBSs) (17.3.2.1.3.2) and argv[0] shall be the
pointer to the initial character of a NTMBS that represents the
name used to invoke the program or ""
--
Loïc
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Fri May 28, 2004 10:56 am Post subject: Re: Récupérer le PATH de mon applic ation |
|
|
Loïc Joly <loic.actarus.joly (AT) wanadoo (DOT) fr> wrote
| Quote: | kanze (AT) gabi-soft (DOT) fr wrote:
Selon la norme, argv[0] doit contenir le nom du programme, non le
chemin de l'executable.
Je préciserai en tant que nom du programme : Il s'agit du nom utilisé
pour invoquer le programme, et non pas d'un nom venu d'ailleur.
|
Seulement en C++, non en C. Et ça veut dire quoi, « invoquer un
programme » ? Sous Unix, seulement un programme peut invoquer un autre
programme, et il n'utilise pas de nom pour ça, mais le chemin de
l'exécutable. Un utilisateur passe des commandes à un « shell », qui les
interprète selon ses propres conventions ; la plupart du temps, le shell
finit par invoquer un programme (c'est la définition d'un shell, je
crois), mais pas toujours, et quand il invoque un programme, le chemin
qu'il passe au système n'a pas nécessairement grand chose à voir avec le
nom que l'utilisateur a donné. (Pense aux alias, par exemple.)
Par convention, sous Unix, les shells passe le premier mot de la
commande, *après* expansion des variables de shell, des alias, etc.,
comme argv[0]. Et le deuxième mot comme argv[1], le troisième comme
argv[2], etc. ; en fait, ils traitent tous les mots pareil.
Mais ce n'est qu'une convention, et ça ne vaut que pour les shells.
Selon la norme C++, qu'est-ce qu'il faut comme argv[0] si j'invoque le
programme en cliquant sur un bouton ? (C'est quand même le cas le plus
courant sur beaucoup de systèmes.)
| Quote: | Quand on lance gcc, il n'y a pas dans argv[0] la chaine "The GNU
Compiler Collection".
|
Ça dépend. Si j'exécute :
execl( "/usr/local/bin/gcc",
"The GNU Compiler Collection",
(char const*)NULL ) ;
dans un programme, par exemple.
Et si tu invoque « xtern -ls », quel est le nom de programme de ton
shell ? (Essaie « echo $0 » pour savoir.)
| Quote: | En plus, il est tout à fait légal d'avoir un argv[0] vide (voire même
pas de argv[0]) :
|
Selon la norme C++, c'est la seule implémentation légale. Mais
évidemment, comme nous savons tous, il n'y a pas de compilateur
conforme. Dans ce cas-ci, heureusement.
| Quote: | If argc is nonzero these arguments shall be supplied in argv[0]
through argv[argc1] as pointers to the initial characters of
nullterminated multibyte strings (NTMBSs) (17.3.2.1.3.2) and argv[0]
shall be the pointer to the initial character of a NTMBS that
represents the name used to invoke the program or ""
|
Ce qui n'est pas ce qu'il dit dans la norme C. Encore une
incompatibilité gratuite. Et une qui dans la pratique rend
l'implémentation de C++ impossible sous Unix. Je doute que c'en était
l'intention. De la norme C99 :
-- If the value of argc is greater than zero, the array members
argv[0] through argv[argc-1] inclusive shall contain pointers to
strings, which are given implementation-defined values by the
host environment prior to program startup. The intent is to
supply to the program information determined prior to program
startup from elsewhere in the hosted envirionment. [...]
-- If the avlue of argc is greater than zero, the string pointed to
by argv[0] represents the program name; argv[0][0] shall
be the null character if the program name is not available from
the host environment. If the value of argc is greater than one,
the strings pointed to by argv[1] through argv[argc-1] represent
the program parameters.
Note bien l'utilisation des italiques dans le deuxième point ; ça
signifie qu'il s'agit d'une définition de l'expression. En C, donc, le
nom du programme, c'est défini comme « la chaîne passée comme argv[0] ».
Et le premier point rend clair que le contenu réel de cette chaîne,
c'est définie par l'implémentation.
Je ne sais pas ce que disait C90 ici. (Je pourrais le vérifier ce soir,
si j'y pense ; j'ai une copie de la norme C90 chez moi.) Mais une chose
est certaine, ce que dit C99 est bien plus raisonable que ce que dit
C++.
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|