⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myrm2.c

📁 使用unix的api实现unix下的rm函数
💻 C
字号:
#include<stdio.h>#include<dirent.h>#include<sys/types.h>#include<sys/stat.h>#include<errno.h>#include <string.h>#include<unistd.h>char remov(char *,char,char,char);int main(int argc, char* argv[]){	int i=0,stat=0;	char ui=0,ur=0,uv=0,oc,choice;	if(argc<2)	{	printf("myrm:缺少操作数\n"); return 0;	}			while((oc=getopt(argc,argv,"ivr"))!=-1)		switch(oc){		case 'i':ui=1;break;		//如果出现-i,则ui=1			case 'r':ur=1;break;		//如果出现-r,则ur=1		case 'v':uv=1;break;		//如果出现-v,则uv=1		}				for(;optind<argc;optind++)	{	if(ui==1)		{		printf("是否进入 目录:\"%s\"\n",argv[optind]);		scanf("%c",&choice);		getchar();		if((choice=='y')||(choice=='Y'))				remov(argv[optind],ui,uv,ur);		//调用remov函数循环删除每一个argv中出现的文件	}	else if(ui!=1)			remov(argv[optind],ui,uv,ur);		}	return 0;}char remov(char *path,char ui, char uv, char ur){	DIR *dir;	struct dirent *entry;	struct stat st;	int ret;		char s[SIZE];	char dirtbit=0,choice;	ret = stat(path,&st); 	if(ret==-1)	{	printf("文件 \"%s\" 打开错误 :%s错误号: %d\n",path,strerror(errno),errno);	return -1;	}		if(S_ISDIR(st.st_mode)&&(ur==1))	//如果是目录而且指定递归的删除则进入	{		dir = opendir(path);		if(dir==NULL)		{		printf("文件 \"%s\" 打开错误 :%s错误号: %d\n",path,strerror(errno),errno);		return -1;		}				while((entry = readdir(dir))!=NULL)		//遍历此目录中的每一个子文件		if((strcmp(entry->d_name,".")!=0)&&(strcmp(entry->d_name,"..")!=0)){			strcpy(s,path);			strcat(s,"/");			strcat(s,entry->d_name);		//将子目录的路径存入s中以便传参			if(ui==1)			//若指定-i选项,则交互删除			{				printf("是否进入 目录:\"%s\"\n",s);				scanf("%c",&choice);				getchar();				if((choice=='y')||(choice=='Y'))						dirtbit=remov(s,ui,uv,ur);	//dirbit用来指明是否该目录已经被删为空目录				else 				dirtbit=-1;		//dirtbit为-1表明目录还没删干净			}			else if(ui!=1)			dirtbit=remov(s,ui,uv,ur);	//如果没有指定-i选项,则直接递归删除		}				if(dirtbit==0)		//如果dirtbit为0的话表明这个目录已经删干净了,下面要删除这个空目录了		{			if(ui==1)		//有-i选项			{				printf("是否删除 目录:\"%s\"\n",path);				scanf("%c",&choice);				getchar();				if((choice=='y')||(choice=='Y'))				{					ret = rmdir(path);					if(uv==1)		//有-v选项					printf("已删除 目录:\"%s\" \n",path);				}				else dirtbit=-1;	//这个目录没有删除掉,则为上一级目录返回-1,说明上一级目录不能删除干净了			}			else if(ui!=1)		//没有-i选项			{				ret = rmdir(path);				if(uv==1)		//没有-v选项				printf("已删除 目录:\"%s\" \n",path);			}				}	}  	else if(S_ISDIR(st.st_mode)&&ur!=1)	//如果要删除的是一个目录但且没有指定递归删除的选项则报错			printf("myrm: 无法删除 “%s”: 是一个目录\n",path);	else 			//如果要删除的不是目录,则调用unlink来删除	{		if(ui==1)		//交互式的删除此文件		{			printf("是否删除 文件:\"%s\"\n",path);			scanf("%c",&choice);			getchar();			if((choice=='y')||(choice=='Y'))			{				ret=unlink(path);				if(uv==1)				printf("已删除 文件:\"%s\" \n",path);			}			else dirtbit=-1;		}		else if(ui!=1)		//直接删除此文件		{			ret=unlink(path);			if(uv==1)			printf("已删除 文件:\"%s\" \n",path);		}	}		return dirtbit;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -