如何以平台无关的方式在C++中更改当前的工作目录?
我找到了与direct.h
Windows兼容的头文件,以及与unistd.h
UNIX/POSIX兼容的头文件.
该chdir
函数适用于POSIX(手册页)和Windows(_chdir
在那里调用但chdir
存在别名).
两个实现在成功时返回零,在出错时返回-1.正如您在联机帮助页中所看到的,POSIX变体中可能存在更多不同的errno值,但对于大多数用例而言,这不应该有所不同.
对于C++,boost :: filesystem :: current_path(setter和getter prototypes).
基于Boost.Filesystem的文件系统库将添加到标准中.
你chdir()
想做什么?它适用于POSIX和Windows.
这个跨平台示例代码,用于在此答案中推荐使用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,并在成功时返回指向同一传递缓冲区的指针.代码示例直接使用此返回的char指针.
该示例基于@ MarcD,但更正了内存泄漏.此外,我努力简洁,没有依赖,只有基本的失败/错误检查,以及确保它在多个(通用)平台上工作.
我在OSX 10.11.6,Centos7和Win10上测试过它.对于OSX和Centos,我曾经g++ changedir.cpp -o changedir
构建并运行为./changedir
.
在Win10上,我用cl.exe changedir.cpp /EHsc /nologo
.
$ cat changedir.cpp
#ifdef _WIN32 #include// 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 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; }
$ g ++ changedir.c -o changedir
$ ./changedir testing
CWD:/ Users/Phil
CWD更改为:/ Users/Phil/testing
$ g ++ changedir.c -o changedir
$ ./changedir
没有提供目录
$ ./changedir does_not_exist
CWD:/ home/phil
$ ./changedir音乐
CWD:/ home/phil
CWD改为:/ home/phil/Music
$ ./ changedir/
CWD:/ home/phil
CWD改为:/
cl.exe changedir.cpp/EHsc/nologo
changedir.cppc:\ Users\Phil> changedir.exe test
CWD:c:\ Users\Phil
CWD更改为:c:\ Users\Phil\test
注意:OSX使用后面的clang
Centos gnu .gcc
g++
你想要的chdir(2)
.如果您尝试让程序更改shell的工作目录 - 则不能.SO上有很多答案已经解决了这个问题.
你的意思是C还是C++?它们是完全不同的语言.
在C中,定义语言的标准不包括目录.许多支持目录的平台都有一个chdir
带char*
或const char*
参数的函数,但即使它存在,它所声明的标题也不是标准的.关于参数意味着什么(例如Windows具有每个驱动器目录),也可能存在细微之处.
在C++中,谷歌搜索导致chdir
和_chdir
,并建议Boost没有chdir的接口.但我不会再评论,因为我不懂C++.