291 votes

Comment obtenir le répertoire à partir duquel un programme fonctionne?

Existe-t-il une méthode agnostique de plate-forme et agnostique de fichier pour obtenir le chemin d'accès complet du répertoire à partir duquel un programme s'exécute en utilisant C / C ++? Ne pas être confondu avec le répertoire de travail actuel. (Merci de ne pas suggérer de bibliothèques à moins qu'elles ne soient standard comme CLIB ou STL.)

(S'il n'y a pas de méthode plate-forme / système de fichiers, les suggestions fonctionnant sous Windows et Linux pour des systèmes de fichiers spécifiques sont également les bienvenues.)

173voto

computinglife Points 2363

Si vous parcourez le répertoire courant quand le programme démarre pour la première fois, alors vous avez effectivement le répertoire de votre programme a été commencé à partir. De stocker la valeur dans une variable et à vous y référer plus tard dans votre programme. Elle est distincte de l'annuaire qui détient l'actuel fichier programme exécutable. Il n'est pas nécessairement le même répertoire; si quelqu'un exécute le programme à partir d'une invite de commandes, puis le programme est exécuté à partir de l'invite de commande du répertoire de travail en cours, même si le fichier de programme de vie ailleurs.

getcwd est une fonction POSIX et pris en charge hors de la boîte, tous conformes à POSIX plates-formes. Vous n'auriez pas à faire quelque chose de spécial (à part incliding la droite des en-têtes de unistd.h sur Unix et direct.h sur windows).

Puisque vous êtes la création d'un programme C, il fera le lien avec la valeur par défaut c des bibliothèques d'exécution qui est lié à TOUS les processus du système (spécialement conçu exceptions éviter), et comprend cette fonction par défaut. Le CRT n'est jamais considéré comme une bibliothèque externe parce que fournit la base conforme à la norme d'interface de l'OS.

Sur windows getcwd fonction a été dépréciée en faveur de _getcwd. Je pense que vous pourriez l'utiliser dans ce mode.

#include <stdio.h>  /* defines FILENAME_MAX */
#ifdef WINDOWS
    #include <direct.h>
    #define GetCurrentDir _getcwd
#else
    #include <unistd.h>
    #define GetCurrentDir getcwd
 #endif

 char cCurrentPath[FILENAME_MAX];

 if (!GetCurrentDir(cCurrentPath, sizeof(cCurrentPath)))
     {
     return errno;
     }

cCurrentPath[sizeof(cCurrentPath) - 1] = '\0'; /* not really required */

printf ("The current working directory is %s", cCurrentPath);

47voto

Octopus Points 1289

Ceci vient du forum cplusplus

Sur les fenêtres:

 #include <string>
#include <windows.h>

std::string getexepath()
{
  char result[ MAX_PATH ];
  return std::string( result, GetModuleFileName( NULL, result, MAX_PATH ) );
}
 

Sur Linux:

 #include <string>
#include <limits.h>
#include <unistd.h>

std::string getexepath()
{
  char result[ PATH_MAX ];
  ssize_t count = readlink( "/proc/self/exe", result, PATH_MAX );
  return std::string( result, (count > 0) ? count : 0 );
}
 

Sur HP-UX:

 #include <string>
#include <limits.h>
#define _PSTAT64
#include <sys/pstat.h>
#include <sys/types.h>
#include <unistd.h>

std::string getexepath()
{
  char result[ PATH_MAX ];
  struct pst_status ps;

  if (pstat_getproc( &ps, sizeof( ps ), 0, getpid() ) < 0)
    return std::string();

  if (pstat_getpathname( result, PATH_MAX, &ps.pst_fid_text ) < 0)
    return std::string();

  return std::string( result );
}
 

30voto

Thorsten79 Points 7975

Si vous voulez un moyen standard sans bibliothèques: Non. Le concept de répertoire n'est pas incluse dans la norme.

Si vous êtes d'accord que certains (portable) dépendance sur un quasi-standard lib est d'accord: l'Utilisation de Boost système de fichiers de la bibliothèque et demander la initial_path().

À mon humble avis, qui est aussi proche que vous pouvez obtenir, avec un bon karma (Boost est une pratique bien établie de haute qualité ensemble de bibliothèques)

10voto

Michael Burr Points 181287

Non, il n'y a pas de manière standard. Je crois que le C/C++ normes ne considèrent même pas l'existence de répertoires (ou un autre fichier système organisations).

Sous Windows, le GetModuleFileName() va renvoyer le chemin complet vers le fichier exécutable du processus en cours lors de la hModule paramètre est défini sur NULL. Je ne peux pas aider avec Linux.

Aussi, vous devez préciser si vous souhaitez que le répertoire courant ou dans le répertoire que le programme image/exécutable se trouve. Comme il est de votre question est un peu ambigu sur ce point.

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