Bootstrap

[LinuxC]_01_递归删除目录

1. 源代码

/**
 * @brief: 递归删除目录(删除该目录以及该目录包含的文件和目录)
 * @return {*}
 * @note: 
 * @param {const char} *dir 要删除的目录绝对路径
 */
int remove_dir(const string &dir) 
{
	char cur_dir[] = ".";
	char up_dir[] = "..";
	char dir_name[128];
	DIR *dirp;
	struct dirent *dp;
	struct stat dir_stat;

	// 参数传递进来的目录不存在,直接返回
	if ( 0 != access(dir.c_str(), F_OK) ) {
		return 0;
	}

	// 获取目录属性失败,返回错误
	if ( 0 > stat(dir.c_str(), &dir_stat) ) {
		perror("get directory stat error");
		return -1;
	}

	if ( S_ISREG(dir_stat.st_mode) ) {	// 普通文件直接删除
		remove(dir.c_str());
	} else if ( S_ISDIR(dir_stat.st_mode) ) {	// 目录文件,递归删除目录中内容
		dirp = opendir(dir.c_str());
		while ( (dp=readdir(dirp)) != NULL ) {
			// 忽略 . 和 ..
			if ( (0 == strcmp(cur_dir, dp->d_name)) || (0 == strcmp(up_dir, dp->d_name)) ) {
				continue;
			}
			
			sprintf(dir_name, "%s/%s", dir.c_str(), dp->d_name);
			remove_dir(dir_name);   // 递归调用
		}
		closedir(dirp);

		rmdir(dir.c_str());		// 删除空目录
	} else {
		perror("unknow file type!");	
	}
	
	return 0;
}


int main(int argc,char* argv[])
{
    remove_dir(argv[1]);
    return 0;
}

2. 测试

在这里插入图片描述

;