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

C Discussion :

Récupérer le chemin d'accès d'un fichier


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2006
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 255
    Par défaut Récupérer le chemin d'accès d'un fichier
    Bonsoir,

    j'aimerais simplement récupérer le chemin d'accès complet d'un fichier passé en paramètre à une fonction.
    Par exemple l'utilisateur lance le script en tapant
    ./fonction.exe toto.txt

    Je dois récupérer le chemin d'accès complet de toto.txt pour le stocker dans une bdd.

    Ca me paraissait simple mais je suis bloqué et je ne trouve rien sur le net.

    Merci à vous

  2. #2
    Membre confirmé Avatar de Rappunzell
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Novembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Novembre 2007
    Messages : 93
    Par défaut
    D'après ton exemple, le fichier toto.txt est dans le même répertoire que ton programme.

    Dans ce cas, il suffit de récupérer le chemin d'accès complet de ton programme. Et ça c'est vachement simple:

    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
     
    int main(int argc, char *argv[])
    {
         char *chemin;
         int i;
     
         i = 12 /*i contient le nombre de caractère du nom de ton programme + 4 (".exe"). Si c'est "fonction.exe", i devra donc contenir 12 */
     
         chemin = (char*)malloc(sizeof (char) * strlen(argv[0] - i) ); /* j'ai pris i pour une meilleur compréhension, mais tu peux directement remplaçer par la bonne valeur, ici, 12 */
     
         strcpy(chemin, argv[0]); /* ceci va copier le chemin d'accès sans le nom du programme (et sans le caractère de fin de chaine '\0') */
     
         strcat(chemin, argv[1]); /* on rajoute le nom de ton fichier à la fin (ça rajoute aussi le '\0') */
     
         return 0;    
    }

  3. #3
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut Re:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy(chemin, argv[0]); /* ceci va copier le chemin d'accès sans le nom du programme (et sans le caractère de fin de chaine '\0') */
    strcpy copie le caractère '\0'. argv[0] pointe sur la commande utilisée pour lancer le programme, sans rien ajouter (hormis le caractère de fin de chaîne). On ne peut pas connaître le chemin qui mène à un fichier (exécutable ou non), par contre on peut récupérer le chemin complet du répertoire courant avec la fonction getcwd (stdlib.h).

  4. #4
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2006
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 255
    Par défaut
    Merci pour vos réponses.

    Le problème c'est que le fichier n'est pas forcément dans le même répertoire que le programme. J'ai fait un alias de ma fonction du genre :
    alias settag = '/home/truc/.../fonction.exe'. Donc on peut exécuter la fonction settag depuis n'importe ou.

    Il n'y a vraiment pas moyen de récupérer le chemin de n'importe quel fichier?
    Ca doit quand même être assez courant non, je ne suis pas le seul à vouloir faire ça quand même...


  5. #5
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    Bonjour,

    Il faut distinguer deux cas.

    1. le chemin est relatif. Dans ce cas, on peut récupérer, par exemple, le répertoire courant comme répertoire de base pour la résolution du chemin.
      Exemple:
      /usr/loca l/toto >mon_prog ../riri/data/mon_fichier
      Le chemind du fichier à traiter est /usr/local/riri/data

    2. le chemin est absolu alors le traitement devient trivial.
      Exemple:
      /usr/loca l/toto >mon_prog /usr/local/riri/data/mon_fichier

  6. #6
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2006
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 255
    Par défaut
    oui chez moi argv[0] retourne seulement le nom de l'exécutable. Mais c'est pas grave tout le monde peut se tromper

    L'utilisateur peut passer ce qu'il veut, aussi bien un chemin relatif qu'absolu.
    Je vérifie juste dans mon programme que le fichier existe bien par un fopen.

    Dans le cas d'un chemin absolu c'est en effet très facil en récupérant argv[1].
    Mais dans l'autre cas je ne voit pas comment faire.

    Et d'ailleur comment savoir si le chemin passé et absolu ou relatif...

    Merci à vous.

  7. #7
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par Rappunzell Voir le message
    il suffit de récupérer le chemin d'accès complet de ton programme. Et ça c'est vachement simple:
    Non, c'est loin d'etre simple. Il n'est pas garanti que argv[0] contienne le chemin complet suivi du nom de l'executable. (Chez moi, par exemple, c'est le nom de l'executable uniquement).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
         i = 12 /*i contient le nombre de caractère du nom de ton programme + 4 (".exe"). Si c'est "fonction.exe", i devra donc contenir 12 */
    Super. Si on change le nom de l'executable, le programme ne marche plus. Tres robuste. Il serait preferable de chercher le dernier '/' (strrchr). Mais comme dit plus haut, argv[0] ne contient pas forcement le chemin complet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
         chemin = (char*)malloc(sizeof (char) * strlen(argv[0] - i) ); /* j'ai pris i pour une meilleur compréhension, mais tu peux directement remplaçer par la bonne valeur, ici, 12 */
    On ne caste pas le retour de malloc(). sizeof (char) vaut 1 par definition. Il faut allouer suffisamment de place pour le '\0' final de la chaine.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
         strcpy(chemin, argv[0]); /* ceci va copier le chemin d'accès sans le nom du programme (et sans le caractère de fin de chaine '\0') */
    chemin est trop petit pour contenir argv[0]. Bug grave. Il suffirait de placer un '\0' dans argv[0] a la position du dernier '/' pour faire le meme travail.

    Superbe post.

  8. #8
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par Yann39
    Il n'y a vraiment pas moyen de récupérer le chemin de n'importe quel fichier?
    En tout cas pas comme ce à quoi tu t'attends. Quand tu exécutes un programme (toto.exe) avec la commande, argv[0] pointe alors sur la chaîne "toto", rien de plus ni de moins. Comment espères-tu pouvoir localiser le fichier avec une information aussi vague? Une solution consiste par exemple à demander au système le chemin du processus courant, donc rien de portable. Une autre solution un peu plus portable est de fouiller tout le disque jusqu'à trouver ce que tu cherches, t'es prêt à faire ça?

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Melem Voir le message
    En tout cas pas comme ce à quoi tu t'attends. Quand tu exécutes un programme (toto.exe) avec la commande, argv[0] pointe alors sur la chaîne "toto", rien de plus ni de moins.
    Non. Ca peut pointer sur :
    • ""
    • "toto"
    • "chemin-relatif/toto"
    • "chemin-absolu/toto"

    Ca dépend de l'implémentation et du système. Attention à ne pas balancer des affirmations non vérifiées... Ce n'est pas la première fois. Ton expérience du C n'est pas "Le C". Je te conseille un peu de lecture :

    http://www.open-std.org/jtc1/sc22/wg...docs/n1124.pdf

Discussions similaires

  1. récupérer chemin d'accés d'un fichier
    Par cédric20 dans le forum Général Java
    Réponses: 3
    Dernier message: 18/06/2011, 19h23
  2. Récupérer le chemin d'accès d'un fichier
    Par LeMeD dans le forum VB.NET
    Réponses: 2
    Dernier message: 27/01/2010, 06h42
  3. Récupérer le chemin d'accés d'un fichier
    Par massol joel dans le forum Contribuez
    Réponses: 2
    Dernier message: 24/10/2006, 16h03
  4. [VBA-E]récupérer le chemin d'accès d'un fichier
    Par gil68 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 05/02/2006, 18h50
  5. Chemin d'accès d'un fichier
    Par guitaros dans le forum Langage
    Réponses: 6
    Dernier message: 16/01/2004, 09h27

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