在Linux,rm -rf 的功能是递归删除指定的目录。其实基本思路还是比较直观的,就是获取要删除的目录名或路径,进入该目录配合readdir挨个删除里面的文件,每次后移首先要判断文件的类型,如果是目录那么就递归调用删除函数直到目录下没有任何文件。
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
void digui_rm(const char *file)
{
DIR *src;//定义一个指针来接收目录
struct dirent *fp;//定义一个指针来读取目录下的文件
char path[1024];//路径
if(!(src=opendir(file)))//接收目录流
{
perror("opendir");
return;
}
while((fp=readdir(src))!=NULL)//开始读取src所指目录下的所有文件
{
if(!strcmp(fp->d_name,".")||!strcmp(fp->d_name,".."))
continue;
snprintf(path,sizeof(path),"%s/%s",file,fp->d_name);//把文件名或目录名接在父目录路径后面存在path里方便再进行递归删除
struct stat buf;
if(stat(path,&buf)==-1)//获取文件属性
{
perror("stat");
return;
}
if(S_ISDIR(buf.st_mode))//用S_ISDIR函数判断获取到的文件类型是否为目录
{
digui_rm(path);//如果是一个目录那就再进去接着删
rmdir(path);//直到目录里所有文件删除返回上一级删除本身
}
else remove(path);//删除路径下非目录文件
}
closedir(src);
}
int main(int argc,const char* argv[])
{
if(argc<3)//严格参考rm -rf的格式来判断
{
printf("请正确引用rm -rf:rm + (-rf) + dir\n");
return 1;
}
digui_rm(argv[2]);//把命令行对应位置的路径传进函数进行递归删除
rmdir(argv[2]);//删除完路径对应目录里的文件,最后还要把本尊删掉
printf("已成功删除此目录下所有文件:%s\n",argv[2]);
return 0;
}
over