Linux下系统api int rmdir(const char *pathname);可以删除目录。但使用rmdir函数时,目录必须为空,否则调用失败,函数返回-1,执行成功时,函数返回0。
  
  也可以通过shell命令rm -rf删除掉非空目录。但在程序中若要调用shell命令必须通过system或者exec函数簇启动一个进程。这样一是耗费系统资源,降低程序执行的效率。二是无法知道执行的结果。故自己实现一个删除非空目录的函数,下面是函数的几个要点:
  
  1.若要删除一个目录,必须将给目录下的文件全部删除,系统调用int remove(const char * pathname)可以删除一个普通文件;
  
  2.需要遍历目录中的每一项,而目录中可能还有目录,故需要用递归调用;
  
  3.每个目录下会有两个默认的目录...分别代表当前目录和上一目录,在遍历的时候需要忽略它们;

4.递归结束的条件是遍历到的文件为普通文件(此时会将普通文件删除);

5.当一个目录中的内容全部被删除之后,便可以删除该目录了。

代码实现如下所示:

#include <sys/stat.h>
#include <dirent.h>
#include <fcntl.h>

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

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

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

	if ( S_ISREG(dir_stat.st_mode) ) {	// 普通文件直接删除
		remove(dir);
	} else if ( S_ISDIR(dir_stat.st_mode) ) {	// 目录文件,递归删除目录中内容
		dirp = opendir(dir);
		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, dp->d_name);
			remove_dir(dir_name);   // 递归调用
		}
		closedir(dirp);

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

如果喜欢我的文章请关注我的公众号,后期会有持续的更新!
在这里插入图片描述

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐