wow-dir文件说明
- 项目地址:https://gitee.com/wow-iot/wow-iot7
- 本文件的的功能主要用于处理文件夹操作,主要涉及检查路径是否为文件夹、创建文件夹(逐层创建)、删除文件夹操作(递归删除);
判断当前路径是否为文件夹
int wow_path_is_dir(char const* pcPath)
{
CHECK_RET_VAL_P(pcPath,-PARAM_INPUT_DATA_IS_NULL,"param input data invalid!\n");
struct stat buf = {0};
CHECK_RET_VAL(stat (pcPath, &buf) == 0,-SYSTEM_STAT_FAILED);
return S_IFDIR == (S_IFDIR & buf.st_mode);
}
创建文件夹-逐层创建
int wow_dir_create(const char* pcPath)
{
int ret = 0;
char *temp, *pos;
CHECK_RET_VAL_P(pcPath,-PARAM_INPUT_DATA_IS_NULL,"param input data invalid!\n");
temp = strdup(pcPath);
pos = temp;
if (strncmp(temp, "/", 1) == 0) {
pos += 1;
} else if (strncmp(temp, "./", 2) == 0) {
pos += 2;
}
for ( ; *pos != '\0' && pos; ++ pos) {
if (*pos == '/') {
*pos = '\0';
ret = mkdir(temp, 0775);
if(errno == EEXIST) ret = 0;
CHECK_RET_BREAK_EXE_P(ret == 0,ret = -SYSTEM_MKDIR_FAILED,"failed mkdir :%s\n",temp);
*pos = '/';
}
}
if (*(pos - 1) != '/') {
ret = mkdir(temp, 0775);
if(errno == EEXIST) ret = 0;
}
free(temp);
return ret;
}
删除文件夹-递归删除
int wow_dir_remove(const char *pcPath)
{
struct dirent *ent = NULL;
char full_path[MAX_PATH_SIZE] = {0};
int ret = 0;
CHECK_RET_VAL_P(pcPath,-PARAM_INPUT_DATA_IS_NULL,"param input data invalid!\n");
DIR *pdir = opendir(pcPath);
CHECK_RET_VAL_P_A(pdir,-SYSTEM_OPENDIR_FAILED,"can not open pcPath: %s\n", pcPath);
while (NULL != (ent = readdir(pdir))) {
if (!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, "..")) {
continue;
}
memset(full_path, 0, MAX_PATH_SIZE);
snprintf(full_path,MAX_PATH_SIZE-1, "%s/%s", pcPath, ent->d_name);
if (ent->d_type == DT_DIR) { ///< 如果是文件夹,则递归删除
ret = wow_dir_remove(full_path);
CHECK_RET_VAL(ret == 0,-SYSTEM_RMDIR_FAILED);
}else{
ret = remove(full_path);
CHECK_RET_VAL(ret == 0,-SYSTEM_REMOVE_FAILED);
}
}
closedir(pdir);
///< 删除空文件夹
return rmdir(pcPath);
}