Chemin d'acces au fichiers

Fermé
doumbia.danse Messages postés 46 Date d'inscription jeudi 3 juillet 2014 Statut Membre Dernière intervention 16 mars 2015 - 26 août 2014 à 14:30
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 - 1 sept. 2014 à 15:11
Bonjour,

Eh bien, moi j'ai fait un petit programme qui doit utiliser certains fichiers, mais bon le problème se trouve au niveau du chemin d'accès:

j'ai mis les fichiers dans le même dossier que le projet, tout marche bien quand on compile le projet étant ouvert dans l' IDE, mais une fois que l'on ferme le projet et aller dans le \bin\Debug\projet.exe, alors là ça ne marche, il n'arrive pas à ouvrir les fichiers(au cas du chemin relatif).

Alors j'ai pensé à utiliser le chemin absolu,et celui-ci marche dans tous les cas. Puisque un ami me demande de lui envoyer le programme .exe, et les ordis n'ayant pas le même nom d'utilisateur ou ignorant le dossier où l'utilisateur( mon ami) va placer les fichiers à utiliser, alors je trouve que le chemin absolu est incapable de gérer la situation à moins que l'on ne demande à l'utilisateur de le saisir dans le programme même

J'aimerai savoir si quelqu'un en a une idée.

Merci d'avance.
A voir également:

4 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
26 août 2014 à 16:25
Bonjour,

Plusieurs solutions. Tu peux interagir avec le système pour récupérer le nom de l'utilisateur etc. Mais non portable.
Le mieux est le chemin relatif. Par contre, il faut que les fichiers soient toujours placés au même endroit relativement que l'exécutable. Ce qui ne semble pas être ton cas vu ton explication.
Autre solution, demander à l'utilisateur lors de la 1ère exécution, le chemin des fichiers.

Cdlt,
1
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 27/08/2014 à 18:46
Salut doumbia.danse, fiddy,

Je pense que doumbia.danse utilise Codeblocks sous Windows.

Lorsque le projet est lancé depuis l'IDE, le répertoire d'exécution pour l'IDE est l'endroit où se trouve le fichier de projet .cbp, et non l'endroit où se trouve l'exécutable.

Lorsque l'exécutable compilé est lancé en dehors de l'IDE, le répertoire d'exécution est naturellement celui qui contient le .exe.

Du coup, les chemins relatifs par rapport au répertoire d'exécution ne sont pas les mêmes dans un cas et dans l'autre, c'est à dire lorsque doumbia.danse développe et débogue son programme, et lorsque le programme est exécuté en dehors de l'IDE.

Si les fichiers doivent se trouver dans le répertoire d'exécution, la solution consiste à utiliser la compilation conditionnelle, en définissant des #define qui vont te permettre d'identifier si la cible de compilation est "Debug" ou "Release".

Tu exécuteras alors avec succès le même code depuis l'IDE en cible Debug et en cliquant sur l'exécutable compilé en cible Release.

Sous Codeblocks, tu peux définir les #define selon les cibles dans Project-Build options...-[Debug|Release]-#defines

Ensuite, tu insères dans ton code des directives de compilation conditionnelles de ce type :

#ifdef debogage
 char * fichier = "bin\Debug\monfichier.txt";
#else
 char * fichier = "monfichier.txt";
#endif



Dal
1
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
Modifié par fiddy le 27/08/2014 à 21:40
Je mettrai plutôt des \\ ou des / dans la chaîne fichier.

Sinon autre variante si on souhaite juste mettre le nom du fichier dans le programme :
#define xstr(s) str(s)
#define str(s) #s

#ifdef _DEBOGAGE
     #define REPERTOIRE "bin\\Debug\\"
#else
     #define REPERTOIRE ".\\"
#endif


int main(void) {
     const char *nomFichier="monfichier.txt";
     const char *fichier=REPERTOIRE xstr(nomFichier);
     /*suite du programme*/
     return 0;
}
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 28/08/2014 à 10:07
On dirait que les doubles slashs sont mangés par CCM (il faut en mettre 3 pour que CCM en garde deux.. hmmf.. du moins ci-dessous). Je ne sais plus si les avais mis ou pas. Quant au slash, tu as raison, il est accepté par Windows comme caractère séparateur de répertoires alternativement à l'antislash, et c'est bien pratique pour éviter d'avoir à les échapper.

Merci fiddy. Oui, avec les finesses de Windows et ses antislashs, bien sûr, il faut bien échapper les antislashs.

En revanche, dans ton else, le
".\\"
ne devrait-il pas être simplement
""
pour Windows ? Le "./" indiquant un exécutable dans le répertoire courant est pour un système Linux, ou de type Unix (POSIX), non ?


Edit: à la lecture de certains posts sur SO, il semble que la notation .\"nom exécutable.exe" soit utilisable sous Windows pour désigner un exécutable dans le répertoire courant et le distinguer d'un appel à un exécutable pouvant être ailleurs dans le PATH. Cependant, je ne trouve aucune source Microsoft confirmant ceci. Si tu as cela sous la main fiddy, cela serait cool de savoir qu'on peut vraiment se reposer dessus.


Dal
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
28 août 2014 à 21:30
Bonne question pour le ".", de même pour le "..". Aussi longtemps que je me souvienne, cela a toujours fonctionné sur Windows (depuis win 3.1 :-)).
Maintenant, de là à dire si on a la garantie que cela fonctionne sur tous les OS... On peut même aller plus loin, qui dit que "/" ou "\\" assure la séparation des répertoires ?
Non, je pense vraiment qu'on peut utiliser "." ou ".." sereinement :-).
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 29/08/2014 à 10:15
Oui, le ".." remonte même au DOS.

Mais si j'ai effectivement souvenir de manuels DOS indiquant la signification de ".." (qui est utilisé aussi bien sous DOS / Windows / Linux / *nix pour désigner le répertoire parent, ou "précédent"), je ne me souviens pas avoir lu quoi que ce soit sur "." dans un manuel Microsoft.

Pour les "/" qui peuvent être utilisés indifféremment des "\", c'est documenté officiellement par Microsoft : https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file?redirectedfrom=MSDN#maxpath :

Note File I/O functions in the Windows API convert "/" to "\" as part of converting the name to an NT-style name, except when using the "\\?\" prefix as detailed in the following sections.

Quoi qu'il en soit, j'espère que doumbia.danse a pu paramétrer son Codeblocks pour utiliser un #define de débogage lui permettant de résoudre son problème :-)


Dal
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
29 août 2014 à 11:54
Même pas besoin d'un #define d'un débogage. Il suffit de définir dans les options de compilation (option -D en gcc de mémoire).
0
doumbia.danse Messages postés 46 Date d'inscription jeudi 3 juillet 2014 Statut Membre Dernière intervention 16 mars 2015
26 août 2014 à 16:54
Au fait le chemin relative ne marche que si le projet est ouvert dans l'IDE.

Et en ce qui concerne la demande du chemin d'accès, c'est ce que j'ai fait pour le moment, j'ai fait de telle sorte qu'il soit demandé à l'utilisateur de saisir le mot de passe(chemin d'accès au fichiers) qu'on enregistre dans un fichier chemin.che placé dans un dossier(nom du dossier:Chemin obligatoire) que l'utilisateur doit créer sur son disque local C:\ pour ne pas lui demande à chaque exécution le chemin d'accès.

Mais cela m'a paru un peu trop compliquée, surtout si celui à qui on envoie le programme ne sait même pas ce que veut dire chemin d'accès ou si son disque local n'est pas le "C:\".
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
Modifié par fiddy le 26/08/2014 à 17:08
L'utilisation de chemin relatif fonctionne également si ce n'est pas lancé depuis l'IDE. Mais, il faut faire très attention à bien regarder d'où se fait l'exécution du programme lorsqu'effectuée depuis l'IDE. Il y a souvent des surprises...


Google is your friend
0