What is a cross-platform way to get the current directory?

前端 未结 3 1449
孤街浪徒
孤街浪徒 2020-12-05 23:55

I need a cross-platform way to get the current working directory (yes, getcwd does what I want). I thought this might do the trick:

#ifdef _WIN32
    #includ         


        
相关标签:
3条回答
  • 2020-12-06 00:32

    Calling getcwd with a NULL pointer is implementation defined. It often does the allocation for you with malloc (in which case your code does have a memory leak). However, it isn't guaranteed to work at all. So you should allocate your own buffer.

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

    The Open Group has an example showing how to get the max path length from _PC_PATH_MAX. You could consider using MAX_PATH on Windows. See this question for caveats to this number on both platforms.

    0 讨论(0)
  • 2020-12-06 00:39

    If it is no problem for you to include, use boost filesystem for convenient cross-platform filesystem operations.

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

    Here is an example.

    EDIT: as pointed out by Roi Danton in the comments, filesystem became part of the ISO C++ in C++17, so boost is not needed anymore:

    std::filesystem::current_path();
    
    0 讨论(0)
  • 2020-12-06 00:49

    You cannot call getcwd with a NULL buffer. As per the Opengroup:

    If buf is a null pointer, the behavior of getcwd() is unspecified.

    Also, getcwd can return NULL which can break a string constructor.

    You'll need to change that to something like:

    char buffer[SIZE];
    char *answer = getcwd(buffer, sizeof(buffer));
    string s_cwd;
    if (answer)
    {
        s_cwd = answer;
    }
    
    0 讨论(0)
提交回复
热议问题