Как получить текущий каталог? - 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 ]

110 голосов
/ 17 мая 2009

Я бы порекомендовал прочитать книгу по C ++, прежде чем идти дальше, так как было бы полезно получить более прочную основу. Ускоренный C ++ от Кенига и Му - отлично.

Чтобы получить путь к исполняемому файлу, используйте GetModuleFileName :

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

Вот функция C ++, которая получает каталог без имени файла:

#include <windows.h>
#include <string>
#include <iostream>
using namespace std;;

string ExePath() {
    char buffer[MAX_PATH];
    GetModuleFileName( NULL, buffer, MAX_PATH );
    string::size_type pos = string( buffer ).find_last_of( "\\/" );
    return string( buffer ).substr( 0, pos);
}

int main() {
    cout << "my directory is " << ExePath() << "\n";
}
36 голосов
/ 17 мая 2009

GetCurrentDirectory не выделяет место для результата, это зависит от вас.

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

Кроме того, взгляните на библиотеку Boost.Filesystem , если вы хотите сделать это C ++.

11 голосов
/ 13 сентября 2012

ИМХО, вот некоторые улучшения анона .

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

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

std::string GetExePath() 
{
  std::string f = GetExeFileName();
  return f.substr(0, f.find_last_of( "\\/" ));
}
4 голосов
/ 02 декабря 2011

Пожалуйста, не забудьте инициализировать ваши буферы до что-то перед их использованием. И, что не менее важно, оставьте место для строковых буферов в конце нулевого значения

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

Ссылка

4 голосов
/ 04 августа 2016
#include <iostream>    
#include <stdio.h>
#include <dirent.h>

std::string current_working_directory()
{
    char* cwd = _getcwd( 0, 0 ) ; // **** microsoft specific ****
    std::string working_directory(cwd) ;
    std::free(cwd) ;
    return working_directory ;
}

int main(){
    std::cout << "i am now in " << current_working_directory() << endl;
}

Мне не удалось правильно использовать GetModuleFileName. Я нашел эту работу очень хорошо. только что протестировал на Windows, еще не попробовал на Linux :)

4 голосов
/ 26 сентября 2018

Не ясно, нужен ли текущий рабочий каталог или путь к каталогу, содержащему исполняемый файл.

Большинство ответов, кажется, отвечают последнему.

Но для первой и второй части вопроса о создании файла стандарт C ++ 17 теперь включает библиотеку файловой системы, что значительно упрощает это:

#include <filesystem>
#include <iostream>

std::filesystem::path cwd = std::filesystem::current_path() / "filename.txt";
std::ofstream file(cwd.string());
file.close();

Это выбирает текущий рабочий каталог, добавляет имя файла к пути и создает пустой файл. Обратите внимание, что объект path заботится об обработке зависимого пути os, поэтому cwd.string () возвращает строку зависимого пути os. Neato.

4 голосов
/ 17 мая 2009

Вы должны предоставить правильный буферный заполнитель то есть:

TCHAR s[100];
DWORD a = GetCurrentDirectory(100, s);
3 голосов
/ 19 февраля 2014
#include <windows.h>
using namespace std;

// The directory path returned by native GetCurrentDirectory() no end backslash
string getCurrentDirectoryOnWindows()
{
    const unsigned long maxDir = 260;
    char currentDir[maxDir];
    GetCurrentDirectory(maxDir, currentDir);
    return string(currentDir);
}
3 голосов
/ 15 марта 2014

Вы можете удалить имя файла из GetModuleFileName() более элегантным способом:

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);

Надеюсь, это поможет!

2 голосов
/ 17 мая 2009

GetCurrentDirectory () получает текущий каталог, в который exe-файл вызывается из . Чтобы получить расположение исполняемого файла, используйте GetModuleFileName (NULL ...). если у вас есть дескриптор exe, или вы можете получить его из GetCommandLine (), если у вас его нет.

Как указывает мистер Баттерворт, вам не нужна ручка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...