Что межплатформенный путь состоит в том, чтобы получить текущий каталог?

Мне нужен межплатформенный способ получить текущий рабочий каталог (да, getcwd делает то, что я хочу). Я думал, что это могло бы добиться цели:

#ifdef _WIN32
    #include 
    #define getcwd _getcwd // stupid MSFT "deprecation" warning
#elif
    #include 
#endif
#include 
#include 
using namespace std;

int main()
{
    string s_cwd(getcwd(NULL,0));
    cout << "CWD is: " << s_cwd << endl;
}

Я получил это чтение:

Не должно быть никаких утечек памяти, и это должно работать над Mac также, корректный?

ОБНОВЛЕНИЕ: Я боюсь, что что-то все еще неправильно здесь (я стараюсь не создавать массив символов с решительной длиной, поскольку нет никакого надлежащего способа получить достойную длину для getcwd):

char* a_cwd = getcwd(NULL,0);
string s_cwd(a_cwd);
free(a_cwd); // or delete a_cwd? 

18
задан Jabberwocky 24 April 2018 в 09:54
поделиться

3 ответа

Вы не можете вызвать getcwd с буфером NULL. Согласно Opengroup:

Если buf является нулевым указателем, поведение getcwd() не определено.

Кроме того, getcwd может вернуть NULL, что может нарушить конструктор строк.

Вам нужно изменить это на что-то вроде:

char buffer[SIZE];
char *answer = getcwd(buffer, sizeof(buffer));
string s_cwd;
if (answer)
{
    s_cwd = answer;
}
14
ответ дан 30 November 2019 в 07:03
поделиться

Если для вас нет проблем с включением, используйте boost filesystem для удобных межплатформенных операций с файловой системой.

boost::filesystem::path full_path( boost::filesystem::current_path() );

Вот пример .

РЕДАКТИРОВАТЬ: как указала Рой Дантон в комментариях, файловая система стала частью ISO C ++ в C ++ 17 , поэтому ускорение больше не требуется:

std::filesystem::current_path();
25
ответ дан 30 November 2019 в 07:03
поделиться

Вызов getcwd с указателем NULL определяется реализацией. Он часто выполняет распределение за вас с помощью malloc (в этом случае в вашем коде есть утечка памяти). Однако это не гарантирует, что это вообще сработает. Таким образом, вы должны выделить свой собственный буфер.

char *cwd_buffer = malloc(sizeof(char) * max_path_len);
char *cwd_result = getcwd(cwd_buffer, max_path_len);

В Open Group есть пример, показывающий, как получить максимальную длину пути из _PC_PATH_MAX. Вы можете рассмотреть возможность использования MAX_PATH в Windows. См. этот вопрос для предупреждений об этом номере на обеих платформах.

2
ответ дан 30 November 2019 в 07:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: