Мне нужен межплатформенный способ получить текущий рабочий каталог (да, 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?
Вы не можете вызвать getcwd
с буфером NULL. Согласно Opengroup:
Если buf является нулевым указателем, поведение getcwd() не определено.
Кроме того, getcwd может вернуть NULL, что может нарушить конструктор строк.
Вам нужно изменить это на что-то вроде:
char buffer[SIZE];
char *answer = getcwd(buffer, sizeof(buffer));
string s_cwd;
if (answer)
{
s_cwd = answer;
}
Если для вас нет проблем с включением, используйте boost filesystem для удобных межплатформенных операций с файловой системой.
boost::filesystem::path full_path( boost::filesystem::current_path() );
Вот пример .
РЕДАКТИРОВАТЬ: как указала Рой Дантон в комментариях, файловая система стала частью ISO C ++ в C ++ 17 , поэтому ускорение больше не требуется:
std::filesystem::current_path();
Вызов 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. См. этот вопрос для предупреждений об этом номере на обеих платформах.