How do I recursively create a folder in Win32?

前端 未结 14 1299
孤城傲影
孤城傲影 2020-12-01 14:11

I\'m trying to create a function that takes the name of a directory (C:\\foo\\bar, or ..\\foo\\bar\\..\\baz, or \\\\someserver\\foo\\bar

14条回答
  •  伪装坚强ぢ
    2020-12-01 14:23

    Here is my example of code (copied from How can I create directory tree in C++/Linux?). Maybe it's not conform all requirements from first post, but pretty well and it works for both Windows and Linux:

    #include 
    #include 
    #include  // stat
    #include     // errno, ENOENT, EEXIST
    #if defined(_WIN32)
    #include    // _mkdir
    #endif
    
    bool isDirExist(const std::string& path)
    {
    #if defined(_WIN32)
        struct _stat info;
        if (_stat(path.c_str(), &info) != 0)
        {
            return false;
        }
        return (info.st_mode & _S_IFDIR) != 0;
    #else 
        struct stat info;
        if (stat(path.c_str(), &info) != 0)
        {
            return false;
        }
        return (info.st_mode & S_IFDIR) != 0;
    #endif
    }
    
    bool makePath(const std::string& path)
    {
    #if defined(_WIN32)
        int ret = _mkdir(path.c_str());
    #else
        mode_t mode = 0755;
        int ret = mkdir(path.c_str(), mode);
    #endif
        if (ret == 0)
            return true;
    
        switch (errno)
        {
        case ENOENT:
            // parent didn't exist, try to create it
            {
                int pos = path.find_last_of('/');
                if (pos == std::string::npos)
    #if defined(_WIN32)
                    pos = path.find_last_of('\\');
                if (pos == std::string::npos)
    #endif
                    return false;
                if (!makePath( path.substr(0, pos) ))
                    return false;
            }
            // now, try to create again
    #if defined(_WIN32)
            return 0 == _mkdir(path.c_str());
    #else 
            return 0 == mkdir(path.c_str(), mode);
    #endif
    
        case EEXIST:
            // done!
            return isDirExist(path);
    
        default:
            return false;
        }
    }
    
    int main(int argc, char* ARGV[])
    {
        for (int i=1; i

    Usage:

    d:\Work\c++\make_path> makePath 1/2 folderA/folderB/folderC
    creating 1/2 ... OK
    creating folderA/folderB/folderC ... OK
    

提交回复
热议问题