Detecter repertoire courant

Detecter repertoire courant - C++ - Programmation

Marsh Posté le 08-05-2003 à 23:56:19    

En C pur, est-ce qu'il est possible de récuperer le répertoire depuis lequel est lancée l'application ? Ce qu'il me faudrait, c'est une chaine contenant ce repertoire, afin de pouvoir ouvrir un fichier qui se trouve dans le meme rep.


---------------
©2008 Bleuarff Corp.
Reply

Marsh Posté le 08-05-2003 à 23:56:19   

Reply

Marsh Posté le 09-05-2003 à 00:53:57    

le langage C ne sait pas ce qu'est un répertoire: le C est un langage hautement portable et ne reconnait que tres  peu de notions. Ici, il ne connait pas la notion de répertoire car elle n'existe pas sur toutes les plateformes (pense à ta machine à laver)
 
mais si tu précises ton système, on devrait pouvoir t'aider

Reply

Marsh Posté le 09-05-2003 à 01:00:42    

++Taz a écrit :

le langage C ne sait pas ce qu'est un répertoire: le C est un langage hautement portable et ne reconnait que tres  peu de notions. Ici, il ne connait pas la notion de répertoire car elle n'existe pas sur toutes les plateformes (pense à ta machine à laver)
 
mais si tu précises ton système, on devrait pouvoir t'aider


 
le prog doit tourner sur win xp et nt4 au moins.


---------------
©2008 Bleuarff Corp.
Reply

Marsh Posté le 09-05-2003 à 01:08:25    

ben là je laisserais quelqu'un d'autre répondre

Reply

Marsh Posté le 09-05-2003 à 01:42:59    

Regarde du cote des fonctions
 


_chdir, _wchdir  Change current working directory  
_chdrive  Change current drive  
_getcwd, _wgetcwd  Get current working directory for default drive  
_getdcwd, _wgetdcwd  Get current working directory for specified drive  
_getdrive  Get current (default) drive  
_mkdir, _wmkdir  Make new directory  
_rmdir, _wrmdir  Remove directory  
_searchenv, _wsearchenv  Search for given file on specified paths  

Reply

Marsh Posté le 09-05-2003 à 07:46:14    

c'est pas des conneries ça? me dit pas qu'ils ont appelés des fonctions publics _* ??? :pfff:

Reply

Marsh Posté le 09-05-2003 à 08:00:10    

GetCurrentDirectory() me parait assez judicieux

Reply

Marsh Posté le 09-05-2003 à 11:14:27    

Taz > nan pas de conneries desole.
 
chrisbk > oui j'ai voulu lui dire cela aussi mais pas sur que ce soit pas du pur vc++

Reply

Marsh Posté le 09-05-2003 à 11:22:01    

et tu changes toujours pas de pseudo.... je te comprendrais jamais

Reply

Marsh Posté le 09-05-2003 à 11:22:59    

Euh le pseudo il a 5 ans vais pas changer pour ca ;)

Reply

Marsh Posté le 09-05-2003 à 11:22:59   

Reply

Marsh Posté le 09-05-2003 à 11:23:56    

VisualC++ a écrit :

Taz > nan pas de conneries desole.
 
chrisbk > oui j'ai voulu lui dire cela aussi mais pas sur que ce soit pas du pur vc++


 
ben quitte a faire
perso j'ai jamais vu/utiliser les fonctions que tu cites....

Reply

Marsh Posté le 09-05-2003 à 11:24:55    

Enfin suivant avec ce que tu compileras bleuarff, tu met le underscore (compilo vc) ou tu le vires.

Reply

Marsh Posté le 09-05-2003 à 11:31:46    

ça par contre c'est une connerie

Reply

Marsh Posté le 09-05-2003 à 11:32:44    

ça par contre c'est une connerie

Reply

Marsh Posté le 09-05-2003 à 11:33:11    

++Taz a écrit :

c'est pas des conneries ça? me dit pas qu'ils ont appelés des fonctions publics _* ??? :pfff:  

Il y a de nombreuses fonctions similaires qui ont un nom XYZ sous unix, et _XYZ sous windows (ca date de la SDK de win 3.0 ou meme avant).
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 09-05-2003 à 12:32:24    

++Taz a écrit :

ça par contre c'est une connerie


 

Citation :


ben là je laisserais quelqu'un d'autre répondre


 
Sans commentaire...  :sarcastic:


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 09-05-2003 à 12:38:03    

VisualC++ a écrit :


oui j'ai voulu lui dire cela aussi mais pas sur que ce soit pas du pur vc++


 
ca veut un peu rien dire ca nan ?
 
tu pourrais tres bien utiliser GetCurrentDirectory() dans un code edité sous notepad (pour ne citer que le meilleur editeur) et compilé avec le intel C++ compiler ou gcc (ah nan pas gcc).

Reply

Marsh Posté le 09-05-2003 à 12:43:56    

gilou a écrit :

Il y a de nombreuses fonctions similaires qui ont un nom XYZ sous unix, et _XYZ sous windows (ca date de la SDK de win 3.0 ou meme avant).
A+,  


 
Toutes les fonctions de la lib CRT, implémentation Microsoft, ont les 2 noms de définis : avec _* et sans. D'après eux, c'est uniquement pour compatibilité.
Tiré du header direct.h

Code :
  1. /* Non-ANSI names for compatibility */
  2. _CRTIMP int __cdecl chdir(const char *);
  3. _CRTIMP char * __cdecl getcwd(char *, int);
  4. _CRTIMP int __cdecl mkdir(const char *);
  5. _CRTIMP int __cdecl rmdir(const char *);


 
Le problème c'est que c'est pas vérifiable qui a raison : les fonctions chdir, mkdir et autres *dir* ne font pas parti du standard C ISO 9899

Reply

Marsh Posté le 09-05-2003 à 13:12:28    

chrisbk a écrit :

GetCurrentDirectory() me parait assez judicieux


 
j'ai vu ça dans la msdn en effet, mais pour ce que j'ai pu essayer g pas encore réussi à m'en servir...jverrais ça plus en detail ce soir.
 
Sinon je suis sous vc mais je tiens à faire du c et pas du cpp.

Reply

Marsh Posté le 09-05-2003 à 13:22:50    

bleuarff a écrit :


Sinon je suis sous vc mais je tiens à faire du c et pas du cpp.


 
Toutes les fonctions de l'API win32 sont en C. Ca marche très bien dans un programme en C donc.
 
exemple

Code :
  1. TCHAR szDir[MAX_PATH + 1];
  2. DWORD dw = GetCurrentDirectory(MAX_PATH, szDir);
  3. if (dw == 0)
  4. {
  5. dw = GetLastError();
  6. // Handle error
  7. }
  8. // Hop! szDir vaut le current path, et c du C.


Reply

Marsh Posté le 09-05-2003 à 18:35:48    

konar_spreme a écrit :


 
Toutes les fonctions de la lib CRT, implémentation Microsoft, ont les 2 noms de définis : avec _* et sans. D'après eux, c'est uniquement pour compatibilité.
Tiré du header direct.h

Code :
  1. /* Non-ANSI names for compatibility */
  2. _CRTIMP int __cdecl chdir(const char *);
  3. _CRTIMP char * __cdecl getcwd(char *, int);
  4. _CRTIMP int __cdecl mkdir(const char *);
  5. _CRTIMP int __cdecl rmdir(const char *);


 
Le problème c'est que c'est pas vérifiable qui a raison : les fonctions chdir, mkdir et autres *dir* ne font pas parti du standard C ISO 9899

Elles sont sans doute dans POSIX.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 10-05-2003 à 02:45:18    

konar_spreme a écrit :


 
Toutes les fonctions de l'API win32 sont en C. Ca marche très bien dans un programme en C donc.
 
exemple

Code :
  1. TCHAR szDir[MAX_PATH + 1];
  2. DWORD dw = GetCurrentDirectory(MAX_PATH, szDir);
  3. if (dw == 0)
  4. {
  5. dw = GetLastError();
  6. // Handle error
  7. }
  8. // Hop! szDir vaut le current path, et c du C.


 


 
C nickel ! merci :jap:


---------------
©2008 Bleuarff Corp.
Reply

Marsh Posté le 13-05-2003 à 00:13:41    

Je suis en train de me frapper la tete contre les murs !
Le pb de récuperer le rep courant c'etait pour ouvrir un fichier se trouvant dans le meme rep que l'exe. Je viens seulement maintenant de me rendre compte que fopen fait ça par défaut :cry: Je me sens très con tout d'un coup :o


---------------
©2008 Bleuarff Corp.
Reply

Marsh Posté le 13-05-2003 à 00:18:50    

lol... Au moins tu auras appris quelque chose !
 
L'important c'est de pas mourrir idiot, non ?

Reply

Marsh Posté le 13-05-2003 à 00:27:08    

Clair que j'aurais appris. C'est surtout que j'ai passé qq heures à faire un truc propre dans le vent. c'est vraiment débile, j'étais tellement persuadé que ça pouvait pas être aussi simple que j'ai meme pas fait un test :/


---------------
©2008 Bleuarff Corp.
Reply

Marsh Posté le 13-05-2003 à 01:02:11    

bleuarff a écrit :

Je suis en train de me frapper la tete contre les murs !
Le pb de récuperer le rep courant c'etait pour ouvrir un fichier se trouvant dans le meme rep que l'exe. Je viens seulement maintenant de me rendre compte que fopen fait ça par défaut :cry: Je me sens très con tout d'un coup :o  


 
tiens, c marrant, c exactement ce ke j'allais te dire...
comme koi, parfois c utile de rien connaitre en prog : ça simplifie la vision des choses !!

Reply

Marsh Posté le 13-05-2003 à 01:31:31    

J'attire quand même ton attention sur le fait que le répertoire courant n'est pas forcemment celui où est l'executable. En effet, il peut être modifié de plusieurs façons (lors de l'ouverture de la boîte de dialogue "Ouvrir"/"Enregistrer sous", avec l'appel de la fonction SetCurrentDirectory ou encore dans le raccourci permettant de lancer le programme).
Donc si tu souhaites ouvrir un fichier dans le même répertoire que ton executable, il vaut mieux utiliser GetModuleFileName qui te donne le chemin vers ton fichier executable. Puis ensuite utiliser PathRemoveFileSpec (ou une fonction perso) pour obtenir uniquement le répertoire.
 
Utiliser le répertoire où se situe le programme peut être pratique, mais il faut se méfier car même si l'utilisateur peut lire dans ce répertoire, il ne peut pas forcemment écrire dedans. Dans de nombreux cas, Windows définit des répertoires privilégiés pour stocker la plupart des fichiers accompagnants un programme (voir la liste des CIDLs).


---------------
each day I don't die is cheating
Reply

Marsh Posté le 13-05-2003 à 13:39:33    

gatorette a écrit :

J'attire quand même ton attention sur le fait que le répertoire courant n'est pas forcemment celui où est l'executable. En effet, il peut être modifié de plusieurs façons (lors de l'ouverture de la boîte de dialogue "Ouvrir"/"Enregistrer sous", avec l'appel de la fonction SetCurrentDirectory ou encore dans le raccourci permettant de lancer le programme).
Donc si tu souhaites ouvrir un fichier dans le même répertoire que ton executable, il vaut mieux utiliser GetModuleFileName qui te donne le chemin vers ton fichier executable. Puis ensuite utiliser PathRemoveFileSpec (ou une fonction perso) pour obtenir uniquement le répertoire.
 
Utiliser le répertoire où se situe le programme peut être pratique, mais il faut se méfier car même si l'utilisateur peut lire dans ce répertoire, il ne peut pas forcemment écrire dedans. Dans de nombreux cas, Windows définit des répertoires privilégiés pour stocker la plupart des fichiers accompagnants un programme (voir la liste des CIDLs).


 
On va dire que mon prog ne change jamais le rep courant, et que celui-ci, que ce soit chez moi ou les ordis des salles info de l'ecole, a toujours un acces en ecriture. Mais merci des précisions :jap:


---------------
©2008 Bleuarff Corp.
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed