2010-05-19 63 views
15

我需要一个跨平台的方式来获取当前的工作目录(是的,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上工作,对吗?

UPDATE:我担心的东西仍然是错在这里(我试图避免产生与确定长度的字符数组,因为有以获取GETCWD一个体面的长度没有正确的方法):

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

回答

12

你不能用NULL缓冲区调用getcwd。根据Opengroup

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

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

你需要改变,要像:

char buffer[SIZE]; 
char *answer = getcwd(buffer, sizeof(buffer)); 
string s_cwd; 
if (answer) 
{ 
    s_cwd = answer; 
} 
+2

如果他只对Windows,Linux和Max OS X的兼容性感兴趣,那么'getcwd(NULL)'是明确定义的。它们都以同样的方式扩展功能。 – 2010-05-19 19:35:54

+0

我接受了这个,但上面的评论是正确的。我的代码确实有内存泄漏,所以需要解决 – rubenvb 2010-05-19 20:07:27

+0

@RobKennedy - 对于Linux,它取决于所针对的版本。例如,在RHEL5框中,'getcwd(NULL)'仍被记录为未定义。 – 2010-05-19 21:13:47

25

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

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

这里是一个example

编辑:在评论中指出的投资回报率丹东,文件系统成为ISO C++ in C++17的一部分,所以不需要再提升:

std::filesystem::current_path(); 
+0

应该提到:试图限制外部依赖,所以没有升压请。 – rubenvb 2010-05-19 19:30:18

+4

啊,好的。我会留下这条评论,以防其他人偶然发现这个问题;) – catchmeifyoutry 2010-05-19 19:30:48

+2

从C++ 14/C++ 17开始,您可以使用'std :: filesystem :: current_path()':http:// en。 cppreference.com/w/cpp/filesystem/current_path – 2017-04-26 09:29:12

2

调用getcwd用NULL指针规定执行。它经常为你使用malloc进行分配(在这种情况下你的代码确实有内存泄漏)。但是,它不能保证一切工作。所以你应该分配你自己的缓冲区。

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

打开组有一个示例显示如何从_PC_PATH_MAX获取最大路径长度。你可以考虑在Windows上使用MAX_PATH。请参阅this question了解这两个平台上的该号码。

+0

std :: string构造函数不会释放malloc的内存吗? – rubenvb 2010-05-19 19:48:50

+0

@rubenvb,不,它只是将字符串初始化为一个副本。它无法知道如何分配'char *'传递。 – 2010-05-19 20:05:23

+0

Dang,好的,谢谢 – rubenvb 2010-05-19 20:06:20

相关问题