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 :

get working directory


Sujet :

C++

  1. #1
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut get working directory
    Salut,

    je bloque sur un truc tout bête, peut-être quelqu'un aura une idée.

    Je suis dans un projet de test, qui utilise le framework de test de boost (boost::unit_test).
    L'exécutable que je veux tester se trouve au même endroit que l'exécutable qui contient les tests. Je souhaite donc récupérer le "working directory" (ou l'endroit où se trouve l'exécutable, dans mon cas c'est la même chose) du code de test.
    Problèmes:
    - je ne veux pas hardcodé le path du working directory car plusieurs personnes doivent pouvoir lancer les tests et chacun a un environnement différent, y compris des O.S. différents.
    - le code doit être portable, au moins linux et windows. Donc je ne peux pas utiliser GetWorkingDirectory().
    - l'exécutable généré, celui qui exécute les tests, utilise le framework boost::unit_test, je n'ai donc pas de main(), puisque ce main() est automatiquement généré par le framework. Je ne peux donc pas récupérer argv[0].

    J'ai pas mal cherché. Du côté de boost::filesystem::current_path() par exemple, mais cette fonction retourne le path du fichier source (.cpp ou .h), et non le "working directory".

    Quelqu'un a une idée?
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Hello,
    l'API C getcwd http://linux.die.net/man/3/getcwd ne convient pas ? C'est au moins sous Unix. Sous Windows tu as _getcwd https://msdn.microsoft.com/en-us/library/sf98bd4y.aspx
    Plus portable je pense pas que tu trouves, va falloir écrire ta propre méthode et l'implémenter sur les différents OS amha

    D'après la doc de boost::filesystem http://www.boost.org/doc/libs/1_60_0...reference.html current_path devrait être le bon résultat
    Returns: The current working directory path, as if by ISO/IEC 9945 getcwd(). is_absolute() is true for the returned path.

    Throws: As specified in Error reporting.

    [Note: The current_path() name was chosen to emphasize that the return is a path, not just a single directory name.

    The current path as returned by many operating systems is a dangerous global variable. It may be changed unexpectedly by a third-party or system library functions, or by another thread. —end note]
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Hmm oui, en fait mon problème venait d'un dev facétieux qui a modifié les settings du projet visual studio, notamment le "Working Directory"...
    Donc en fait, current_path() fera l'affaire.

    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  4. #4
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 391
    Points
    11 391
    Billets dans le blog
    11
    Par défaut
    Méfie-toi, avec ce que VisualStudio met. Par défaut c'est le dossier de build. Je ne fie plus à ce que VS a défini.
    Si tu veux le dossier de l'exécutable, je te conseille de passer par argv[0].
    De plus il me semble que boost.Test fournit ce qu'il faut à ce niveau là
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,
    Citation Envoyé par dragonjoker59 Voir le message
    Méfie-toi, avec ce que VisualStudio met. Par défaut c'est le dossier de build. Je ne fie plus à ce que VS a défini.
    Si tu veux le dossier de l'exécutable, je te conseille de passer par argv[0].
    De plus il me semble que boost.Test fournit ce qu'il faut à ce niveau là
    En fait, oui, pour autant que je sache, il est tout à fait possible d'écrire sa propre fonction main avec boost::unit_test. Mais je crois que cela se fait au dépends d'autres facilités, comme l'auto-enregistrement des tests cases.

    En plus, on peut assez facilement envisager le fait que chaque fichier *.cpp implémentant des tests unitaires soit compilé en une application unique, même si certains (tous ) sont composés de différents tests cases. Et, dans ce cas, cela commence peut être à devenir compliqué à gérer si le besoin de connaitre le dossier de travail est présent dans plusieurs fichiers d'implémentation

    Enfin, bon... (AUCAKOU) : si l'enregistrement manuel des suites de tests est envisageable, la fonction à utiliser pour récupérer argv est -- si l'on en croit cette page -- la fonction test_suite* init_unit_test_suite( int /*argc*/, char* /*argv*/[] )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Citation Envoyé par dragonjoker59 Voir le message
    Si tu veux le dossier de l'exécutable, je te conseille de passer par argv[0].
    argv[0] ne contient pas forcément le dossier de l’exécutable, mais plutôt le nom sous lequel le programme a été invoqué (ce peut-être un lien symbolique, par exemple, ou quelque chose de la forme ./ma_commande).

  7. #7
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 391
    Points
    11 391
    Billets dans le blog
    11
    Par défaut
    Hors de Boost.Test, j'utilise GetModuleFileName sous Windows, et /proc/<pid>/exe sous Linux:
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    Path File::GetWorkingDirectory()
    {
    	Path l_return;
     
    #if defined( _WIN32 )
     
    	TCHAR l_path[FILENAME_MAX];
    	DWORD l_result = GetModuleFileName( NULL, l_path, _countof( l_path ) );
     
    	if ( l_result )
    	{
    		l_return = l_path;
    	}
     
    #elif defined( __linux__ )
     
    	char l_path[FILENAME_MAX];
    	std::stringstream l_stream;
    	l_stream << "/proc/" << getpid() << "/exe";
    	int l_bytes = std::min< std::size_t >( readlink( l_stream.str().c_str(), l_path, sizeof( l_path ) ), sizeof( l_path ) - 1 );
     
    	if ( l_bytes > 0 )
    	{
    		l_path[l_bytes] = '\0';
    		l_return = l_path;
    	}
     
    #else
    #	error "Unsupported platform"
    #endif
     
    	l_return = l_return.GetPath();
    	return l_return;
    }
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    @dragonjoker59: La seule chose qui me choque là-dedans, c'est le nom de la fonction: Tu devrais l'appeler GetExecutableDirectory() ou un truc du genre à la place, parce que le terme "working directory" désigne le répertoire courant (celui retourné par getcwd()) qui n'est pas garanti être celui de l'exécutable (et si l'exécutable est dans le PATH, il a de grandes chances de ne pas l'être).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 391
    Points
    11 391
    Billets dans le blog
    11
    Par défaut
    @Medinoc: tu as raison, je m'en occupe derechef.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

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

Discussions similaires

  1. [Continuum] Error executing action 'update-project-from-working-directory'
    Par Thotem dans le forum Intégration Continue
    Réponses: 0
    Dernier message: 26/01/2009, 11h32
  2. Working Directory avec OC4J
    Par moezsokrati dans le forum Forms
    Réponses: 3
    Dernier message: 11/12/2008, 18h43
  3. Pb script SSH et PWD (print working directory)
    Par stillcut dans le forum Linux
    Réponses: 1
    Dernier message: 15/05/2008, 16h57
  4. [Continuum] Api XmlRpc, working-directory/build-output-directory
    Par dev09 dans le forum Intégration Continue
    Réponses: 1
    Dernier message: 23/11/2007, 11h58
  5. SVN et Working directory
    Par cchevalier72 dans le forum Eclipse
    Réponses: 1
    Dernier message: 06/11/2007, 17h11

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