实现Linux命令 rm -rf 功能

        在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值