linux mkdir函数创建多层文件夹

2019-01-03  本文已影响0人  伪乐观的W先生
int mkdirMulti(const char* path) {
    if(!path) {
        printf("path is NULL!!!\n");
        return -1;
    }
    if(access(path, F_OK) == 0) {
        return 0;
    }
    std::string directory;
    const char* currentDir = strrchr(path, '/');
    if(currentDir) {
        //走到这里说明传进来的path是不存在的,我们要获取上一层的目录,再做同样的判断
        directory = std::string(path, currentDir-path);
        int ret = mkdirMulti(directory.c_str());
        if(ret == 0) {
            //此处if判断是为了"xxx/xxx/"这种格式的路径做处理的,
            //因为"xxx/xxx/"和"xxx/xxx"对于我们代码来说是两种路径,但其实是同一个路径,mkdir会因为递归调用,
            //分别将两者用mkdir创建一次,第二次的创建会因为第一次已经创建了,导致失败, 就会返回一个-1,但其实第一次已经成功了。
            if((access(path, F_OK) == 0)) {
                return 0;
            } else {
                int mkdir_ret = mkdir(path, S_IRWXU);
                return mkdir_ret;
            }
        } else {
            //情况1:最上层的"/xxx"也不存在的时候,directory会是空的,所以递归mkdirMulti的时候会走到判空中,返回-1,这个时候应该去创建目录一下
            //情况2:mkdirMulti递归创建失败,这种情况比较少,比如没有权限,mkdir失败
            int mkdir_ret = mkdir(path, S_IRWXU);
            return mkdir_ret;
        }
    } else {
        //这种是针对直接传"xxx/xxx"的路径
        int mkdir_ret = mkdir(path, S_IRWXU);
        return mkdir_ret;
    }
}
上一篇下一篇

猜你喜欢

热点阅读