此跨平台示例代码使用 POSIX chdir 和 MS _chdir 更改工作目录,如 this answer 中推荐的那样。同样,为了确定当前工作目录,使用类似的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 <path> 运行。
在 Win10 上,我使用 cl.exe changedir.cpp /EHsc /nologo 构建。
MVP 解决方案
$ cat changedir.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++ changedir.c -o changedir
$ ./changedir 测试
CWD:/用户/Phil
CWD 更改为:/Users/Phil/testing
Centos 列表:
$ 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 更改为:/
Win10上市
cl.exe 更改了ir.cpp /EHsc /nologo
改变ir.cpp
c:\Users\Phil> changedir.exe 测试
CWD: c:\Users\Phil
CWD 改为:c:\Users\Phil\test
注意:OSX 在g++ 后面使用clang 和Centos gnu gcc。