Comment obtenir l’annuaire actuel?

Je l’ai fait en C # et Delphi, mais C ++ est mauvais. Le but est de créer un fichier dans le répertoire actuel (où l’exécutable est en cours d’exécution).

Mon code:

LPTSTR NPath = NULL; DWORD a = GetCurrentDirectory(MAX_PATH,NPath); HANDLE hNewFile = CreateFile(NPath,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); 

Je reçois une exception à GetCurrentDirectory ().

S’il vous plaît dites-moi pourquoi je reçois une exception et comment puis-je le rendre plus facile en C ++?

Je vous recommande de lire un livre sur C ++ avant d’aller plus loin, car il serait utile d’avoir une base plus solide. C ++ accéléré par Koenig et Moo est excellent.

Pour obtenir le chemin exécutable, utilisez GetModuleFileName :

 char buffer[MAX_PATH]; GetModuleFileName( NULL, buffer, MAX_PATH ); 

Voici une fonction C ++ qui obtient le répertoire sans le nom de fichier:

 #include  #include  #include  using namespace std;; ssortingng ExePath() { char buffer[MAX_PATH]; GetModuleFileName( NULL, buffer, MAX_PATH ); ssortingng::size_type pos = ssortingng( buffer ).find_last_of( "\\/" ); return ssortingng( buffer ).substr( 0, pos); } int main() { cout << "my directory is " << ExePath() << "\n"; } 

GetCurrentDirectory n’alloue pas d’espace pour le résultat, c’est à vous de le faire.

 TCHAR NPath[MAX_PATH]; GetCurrentDirectory(MAX_PATH, NPath); 

Jetez également un coup d’oeil à la bibliothèque Boost.Filesystem si vous voulez faire cela de la manière C ++.

IMHO voici quelques améliorations à la réponse d’ Anon .

 #include  #include  #include  std::ssortingng GetExeFileName() { char buffer[MAX_PATH]; GetModuleFileName( NULL, buffer, MAX_PATH ); return std::ssortingng(buffer); } std::ssortingng GetExePath() { std::ssortingng f = GetExeFileName(); return f.substr(0, f.find_last_of( "\\/" )); } 

Vous devez fournir un espace réservé de tampon valide. C’est:

 TCHAR s[100]; DWORD a = GetCurrentDirectory(100, s); 

Vous pouvez supprimer le nom de fichier de GetModuleFileName() de manière plus élégante:

 TCHAR fullPath[MAX_PATH]; TCHAR driveLetter[3]; TCHAR directory[MAX_PATH]; TCHAR FinalPath[MAX_PATH]; GetModuleFileName(NULL, fullPath, MAX_PATH); _splitpath(fullPath, driveLetter, directory, NULL, NULL); sprintf(FinalPath, "%s%s",driveLetter, directory); 

J’espère que cela aide!

S’il vous plaît ne pas oublier d’initialiser vos tampons à quelque chose avant de les utiliser. Et tout aussi important, donnez à votre chaîne de caractères un espace pour la fin de la nullité

 TCHAR path[MAX_PATH+1] = L""; DWORD len = GetCurrentDirectory(MAX_PATH, path); 

Référence

GetCurrentDirectory () obtient le répertoire en cours qui est à partir duquel l’exe est appelé. Pour obtenir l’emplacement de l’exe, utilisez GetModuleFileName (NULL …). Si vous avez le handle de l’exécutable, ou vous pouvez le dériver de GetCommandLine () si vous ne le faites pas.

Comme le fait remarquer M. Butterworth, vous n’avez pas besoin de poignée.

 #include  #include  #include  std::ssortingng current_working_directory() { char* cwd = _getcwd( 0, 0 ) ; // **** microsoft specific **** std::ssortingng working_directory(cwd) ; std::free(cwd) ; return working_directory ; } int main(){ std::cout << "i am now in " << current_working_directory() << endl; } 

Je n'ai pas réussi à utiliser GetModuleFileName correctement. J'ai trouvé ce travail très bien. juste testé sur Windows, pas encore essayé sur Linux 🙂

 WCHAR path[MAX_PATH] = {0}; GetModuleFileName(NULL, path, MAX_PATH); PathRemoveFileSpec(path); 
 #include  using namespace std; // The directory path returned by native GetCurrentDirectory() no end backslash ssortingng getCurrentDirectoryOnWindows() { const unsigned long maxDir = 260; char currentDir[maxDir]; GetCurrentDirectory(maxDir, currentDir); return ssortingng(currentDir); } 

Pourquoi personne ne pense-t-il à utiliser ce code simple?

 TCHAR szDir[MAX_PATH] = { 0 }; GetModuleFileName(NULL, szDir, MAX_PATH); szDir[std::ssortingng(szDir).find_last_of("\\/")] = 0; 

ou même plus simple

 TCHAR szDir[MAX_PATH] = { 0 }; TCHAR* szEnd = nullptr; GetModuleFileName(NULL, szDir, MAX_PATH); szEnd = _tcsrchr(szDir, '\\'); *szEnd = 0; 

Extraits de code de mon projet CAE avec environnement de développement Unicode:

 /// @brief Gets current module file path. std::ssortingng getModuleFilePath() { TCHAR buffer[MAX_PATH]; GetModuleFileName( NULL, buffer, MAX_PATH ); CT2CA pszPath(buffer); std::ssortingng path(pszPath); std::ssortingng::size_type pos = path.find_last_of("\\/"); return path.substr( 0, pos); } 

Utilisez simplement le modèle CA2CAEX ou CA2AEX qui appelle l’API interne :: MultiByteToWideChar ou :: WideCharToMultiByte .

Pour trouver le répertoire où se trouve votre exécutable, vous pouvez utiliser:

 TCHAR szFilePath[_MAX_PATH]; ::GetModuleFileName(NULL, szFilePath, _MAX_PATH); 
 Ssortingng^ exePath = Application::ExecutablePath;
MessageBox::Show(exePath);