Этот кроссплатформенный пример кода для изменения рабочего каталога с использованием POSIX chdir
и MS _chdir
, как рекомендуется в этого ответа .Аналогично для определения текущего рабочего каталога используются аналогичные getcwd
и _getcwd
.
Эти различия в платформе скрыты за макросами cd
и cwd
.
Согласно документации, подпись chdir
равна int chdir(const char *path)
, где path
является абсолютным илиродственник.chdir
вернет 0 в случае успеха.getcwd
немного сложнее, потому что ему нужен (в одном варианте) буфер для хранения извлеченного пути, как видно из char *getcwd(char *buf, size_t size)
.В случае ошибки он возвращает NULL и указатель на тот же переданный буфер в случае успеха.Пример кода напрямую использует этот возвращенный указатель на символ.
Пример основан на @ MarcD, но исправляет утечку памяти.Кроме того, я стремился к краткости, отсутствию зависимостей и только базовой проверке ошибок / ошибок, а также обеспечению того, чтобы она работала на нескольких (общих) платформах.
Я тестировал ее на OSX 10.11.6, Centos7 и Win10.Для OSX и Centos я использовал g++ changedir.cpp -o changedir
для сборки и работал как ./changedir <path>
.
На Win10 я построил с cl.exe changedir.cpp /EHsc /nologo
.
MVP решением
$ cat changeir.cpp
#ifdef _WIN32
#include <direct.h>
// MSDN recommends against using getcwd & chdir names
#define cwd _getcwd
#define cd _chdir
#else
#include "unistd.h"
#define cwd getcwd
#define cd chdir
#endif
#include <iostream>
char buf[4096]; // never know how much is needed
int main(int argc , char** argv) {
if (argc > 1) {
std::cout << "CWD: " << cwd(buf, sizeof buf) << std::endl;
// Change working directory and test for success
if (0 == cd(argv[1])) {
std::cout << "CWD changed to: " << cwd(buf, sizeof buf) << std::endl;
}
} else {
std::cout << "No directory provided" << std::endl;
}
return 0;
}
Листинг OSX:
$ g ++ changesir.c -o changeir
$ ./changedir тестирование
CWD: / Users / Phil
CWD изменен на: / Users / Phil / testing
Листинг Centos:
$ g ++ changesir.c -o changeir
$ ./changedir
Каталог не предоставлен
$ ./changedir does_not_exist
CWD: / home / phil
$ ./changedir Музыка
CWD: / home / phil
CWD измененв: / home / phil / Music
$ ./changedir /
CWD: / home / phil
CWD изменен на: /
Список Win10
cl.exe updatedir.cpp / EHsc / nologo
changeir.cpp
c: \ Users \ Phil> тест changeir.exe
CWD: c: \ Users \ Phil
CWD изменено на: c: \ Users \ Phil \ test
Примечание: OSX использует clang
и Centos GNU gcc
позади g++
.