📄 myrm2.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 + -