23

我需要一种跨平台的方式来获取当前的工作目录(是的,getcwd 做了我想要的)。我认为这可能会奏效:

#ifdef _WIN32
    #include <direct.h>
    #define getcwd _getcwd // stupid MSFT "deprecation" warning
#elif
    #include <unistd.h>
#endif
#include <string>
#include <iostream>
using namespace std;

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

我得到了这个阅读:

应该没有内存泄漏,它也应该在 Mac 上工作,对吗?

更新:我担心这里仍然有问题(我试图避免创建具有确定长度的 char 数组,因为没有适当的方法为 getcwd 获得合适的长度):

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

3 回答 3

27

如果您包含没有问题,请使用boost filesystem进行方便的跨平台文件系统操作。

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

这是一个例子

编辑:正如 Roi Danton 在评论中指出的那样,文件系统成为C++17 中 ISO C++ 的一部分,因此不再需要提升:

std::filesystem::current_path();
于 2010-05-19T19:28:54.323 回答
14

您不能getcwd使用 NULL 缓冲区调用。根据开放组

如果 buf 是空指针,则 getcwd() 的行为未指定。

此外,getcwd 可以返回 NULL,这会破坏字符串构造函数。

您需要将其更改为:

char buffer[SIZE];
char *answer = getcwd(buffer, sizeof(buffer));
string s_cwd;
if (answer)
{
    s_cwd = answer;
}
于 2010-05-19T19:32:08.100 回答
2

使用 NULL 指针调用getcwd是实现定义的。它通常使用 malloc 为您分配(在这种情况下,您的代码确实存在内存泄漏)。但是,它根本不能保证工作。所以你应该分配你自己的缓冲区。

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

Open Group 有一个示例展示如何从 _PC_PATH_MAX 获取最大路径长度。您可以考虑在 Windows 上使用MAX_PATH 。有关两个平台上此数字的注意事项,请参阅此问题。

于 2010-05-19T19:32:05.987 回答