C语言实现Linux下删除非空目录
2017-07-12 11:45
387 查看
Linux下系统api
也可以通过shell命令
1.若要删除一个目录,必须将给目录下的文件全部删除,系统调用
2.需要遍历目录中的每一项,而目录中可能还有目录,故需要用递归调用;
3.每个目录下会有两个默认的目录
4.递归结束的条件是遍历到的文件为普通文件(此时会将普通文件删除);
5.当一个目录中的内容全部被删除之后,便可以删除该目录了。
代码实现如下所示:
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; }
相关文章推荐
- Linux用c语言实现删除某个目录下的文件
- 自己用代码实现非空目录的删除(java及C语言)
- Linux下如何删除非空目录
- Linux如何删除非空目录
- linux下删除非空目录
- 在linux下删除非空目录
- Linux下c语言实现将一个目录下的所有文件和目录复制到另一个目录下
- linux下c语言实现搜索根目录下所有文件
- Linux下如何删除非空目录
- linux下 rm 删除非空目录
- Linux下如何删除非空目录
- 一个利用递归算法实现删除非空目录的函数
- linux下使用c语言删除指定目录下所有文件
- linux在指定目录下创建文件夹的c语言实现
- 【转】实现新建多级目录(树形)linux-c语言
- linux删除非空目录
- 基于POSIX在Linux下C语言实现读取整个目录文件[Get a List of Files in a Directory with C]
- linux下 rm 删除非空目录
- linux下用c语言实现ls -l 对文件或者目录的属性遍历
- linux删除多级非空目录