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;
}
}
网友评论