160 votes

Obtenir le chemin de l'exécutable

Je sais que cette question a été posée mais je n'ai pas encore vu une réponse satisfaisante, ou un définitif "non, cela ne peut être fait", donc, je vais demander à nouveau!

Tout ce que je veux faire est d'obtenir le chemin d'accès à l'exécutable, soit un chemin absolu ou par rapport à l'endroit où le fichier exécutable est appelé à partir, dans une plate-forme indépendante de la mode. J'ai bien boost::filesystem::initial_path était la réponse à mes problèmes, mais qui semble être la seule à gérer la " indépendant de la plate-' partie de la question - il encore retourne le chemin d'accès à partir duquel l'application a été invoquée.

Pour un peu de fond, c'est un jeu à l'aide de l'Ogre, que je suis en train de profil à l'aide de Très Somnolent, qui se déroule à la cible exécutable à partir de son propre répertoire, donc bien sur de charger le jeu ne trouve pas de fichiers de configuration, etc. et rapidement se bloque. Je veux être en mesure de passer un chemin d'accès absolu vers les fichiers de configuration, qui je sais vivent toujours à côté de l'exécutable. Il en va de même pour le débogage dans Visual Studio, j'aimerais être en mesure d'exécuter $(TargetPath) sans avoir à définir le répertoire de travail.

116voto

Duck Points 17054

Il n'y a pas de chemin multi-plateforme que je connaisse.

Pour Linux: readlink / proc / self / exe

Windows: GetModuleFileName

31voto

Ryu Points 4542

De cette façon utilise boost + argv. Vous avez mentionné que cela ne serait peut-être pas multiplateforme, parce que le nom de l'exécutable pourrait ou non être inclus. Le code suivant devrait contourner ce problème.

 #include <boost/filesystem/operations.hpp>

#include <boost/filesystem/path.hpp>

#include <iostream>

namespace fs = boost::filesystem;


int main(int argc,char** argv)
{
    fs::path full_path( fs::initial_path<fs::path>() );

    full_path = fs::system_complete( fs::path( argv[0] ) );

    std::cout << full_path << std::endl;

    //Without file name
    std::cout << full_path.stem() << std::endl;
    //std::cout << fs::basename(full_path) << std::endl;

    return 0;
}
 

Le code suivant obtient le répertoire de travail actuel qui peut faire ce dont vous avez besoin

 #include <boost/filesystem/operations.hpp>
#include <boost/filesystem/path.hpp>

#include <iostream>

namespace fs = boost::filesystem;


int main(int argc,char** argv)
{
    //current working directory
    fs::path full_path( fs::current_path<fs::path>() );

    std::cout << full_path << std::endl;

    std::cout << full_path.stem() << std::endl;
    //std::cout << fs::basepath(full_path) << std::endl;

    return 0;
}
 

Note Je viens de me rendre compte que basename( ) était déprécié, il a donc fallu passer à .stem()

23voto

SturmCoder Points 159

Je ne suis pas sûr de Linux, essayez encore ceci pour Windows:

 #include <windows.h>
#include <iostream>

using namespace std ;

int main()
{
    char ownPth[MAX_PATH]; 

    // Will contain exe path
    HMODULE hModule = GetModuleHandle(NULL);
    if (hModule != NULL)
    {
     // When passing NULL to GetModuleHandle, it returns handle of exe itself
     GetModuleFileName(hModule,ownPth, (sizeof(ownPth))); 

     // Use above module handle to get the path using GetModuleFileName()
     cout << ownPth << endl ;
     system("PAUSE");
     return 0;
    }
    else
    {
     cout << "Module handle is NULL" << endl ;
     system("PAUSE");
     return 0;
    }
}
 

14voto

Siva Points 31

Pour les fenêtres:

GetModuleFileName - retourne le chemin exe + le nom de fichier exe

Pour supprimer le nom de fichier
PathRemoveFileSpec

1voto

Clifford Points 29933

Cela fonctionne pour moi:

 #include <iostream>

using namespace std ;

int main( int argc, char** argv)
{
    cout << argv[0] << endl ; ;
    return 0;
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X