Как получить текущий каталог? - PullRequest
51 голосов
/ 17 мая 2009

Я делал это в C # и Delphi, но C ++ - зло. Цель - создать файл в текущем каталоге (где исполняется исполняемый файл).

Мой код:

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

Я получаю исключение в GetCurrentDirectory ().

Скажите, пожалуйста, почему я получаю исключение и как мне сделать это проще в C ++?

Ответы [ 17 ]

2 голосов
/ 09 января 2013
WCHAR path[MAX_PATH] = {0};
GetModuleFileName(NULL, path, MAX_PATH);
PathRemoveFileSpec(path);
1 голос
/ 10 ноября 2018

Простой способ сделать это:

int main(int argc, char * argv[]){
    std::cout << argv[0]; 
    std::cin.get();
}

argv[] - это в значительной степени массив, содержащий аргументы, с которыми вы запускали .exe, но первым всегда является путь к исполняемому файлу. Если я соберу это, консоль покажет: C:\Users\Ulisse\source\repos\altcmd\Debug\currentdir.exe

1 голос
/ 25 августа 2017

Почему здесь никто не подумает об использовании этого простого кода?

TCHAR szDir[MAX_PATH] = { 0 };

GetModuleFileName(NULL, szDir, MAX_PATH);
szDir[std::string(szDir).find_last_of("\\/")] = 0;

или даже проще

TCHAR szDir[MAX_PATH] = { 0 };
TCHAR* szEnd = nullptr;
GetModuleFileName(NULL, szDir, MAX_PATH);
szEnd = _tcsrchr(szDir, '\\');
*szEnd = 0;
0 голосов
/ 17 мая 2019

Если вы используете библиотеку Poco , это одна строка и она должна работать на всех платформах, я думаю.

Poco::Path::current()
0 голосов
/ 17 мая 2009

Чтобы найти каталог, в котором находится ваш исполняемый файл, вы можете использовать:

TCHAR szFilePath[_MAX_PATH];
::GetModuleFileName(NULL, szFilePath, _MAX_PATH);
0 голосов
/ 14 октября 2014

Фрагменты кода из моего проекта CAE со средой разработки Unicode:

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

Просто используйте шаблон CA2CAEX или CA2AEX , который вызывает внутренний API :: MultiByteToWideChar или :: WideCharToMultiByte

0 голосов
/ 19 апреля 2014
String^ exePath = Application::ExecutablePath;<br>
MessageBox::Show(exePath);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...