📄 1.cpp
字号:
#include <io.h>
#include <dir.h>
#include <dos.h>
#include <alloc.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void push(char *p); //压栈函数
void pop(char *p); //出栈函数
int delsub(char *dn); //删除目录函数
char *stack[500]; //栈
int sp=0; //栈计数器
char delcurdir[MAXDIR]; //删除盘的当前目录
int main(int argc,char *argv[])
{
int curdrive,deldrive,done,a;
char curdir[MAXDIR],drive[MAXDRIVE],dir[MAXDIR],file[MAXFILE],ext[MAXEXT];
//MAXDIR文件子目录说明
//MAXDRIVE文件盘符
//MAXFILE不带扩展名的文件名
//MAXEXT文件扩展名
//MAXPATH带完整路径的文件名
struct ffblk b; //ffblk为指定的保存信息的一个结构
//包含文件属性,时间,日期,长度,文件名定义定义
if(argc<2) //判断主函数传参是否正确
{
printf("请输入完整路径\n");
return 0;
}
/* 保存当前盘和当前目录 */
curdrive=getdisk(); //定义在dir.h 返回一个整数(0=A,1=B等)
getcwd(curdir,MAXDIR); //定义在dir.h中,取当前工作目录并存到curdir中
fnsplit(argv[1],drive,dir,file,ext); //将传参获取的盘符分解成盘符,路径,文件名,扩展名
strcat(file,ext); //组成文件名,将ext添加至file末尾
if(!strchr(argv[1],':'))
deldrive=curdrive; //如果缺省盘符,默认是当前盘
else
deldrive=toupper(drive[0])-'A'; //小写转大写,取盘符 返回整数(0=A,1=B等)
setdisk(deldrive); //从当前盘转到要删除的目录所在的盘
getcwd(delcurdir,MAXDIR); //取删除盘的当前目录 存取到全局变量delcurdir[MAXDIR]中
if(!strchr(argv[1],'\\')) //如果缺省路径,默认是当前目录
strcpy(dir,delcurdir); //字符串复制,将delcurdir内容复制到dir中
a=chdir(dir); //转目录,使dir变成当前工作目录,成功返回0
done=findfirst(file,&b,55); //在当前目录查找相应类型的文件
if(done==-1||a==-1) //如果没有找到或目录不存在
{
printf("Not found:%s\n",argv[1]); //输出未发现
chdir(delcurdir); //使delcurdir变成当前工作目录
setdisk(curdrive); //从当前目录转到curdrive盘
chdir(curdir); //使curdir变成当前工作目录
return -1;
}
printf("Deleting %s......\n",argv[1]); //输出删除....
while(!done)
{
if(b.ff_attrib&FA_DIREC) //如果是目录
{
if((strcmp(b.ff_name,".")!=0)&&(strcmp(b.ff_name,"..")!=0)) //排除"."和".."两个特殊目录
delsub(b.ff_name); //调用删除函数
}
else //否则是文件
{
_chmod(b.ff_name,1,FA_ARCH); //设置文件属性,去掉文件其他属性
unlink(b.ff_name); //删除文件b.ff_name
}
done=findnext(&b); //查找向匹配的文件
}
// 恢复当前盘和当前目录
chdir(delcurdir); //使delcurdir变成当前工作目录
setdisk(curdrive); //设置当前驱动器
chdir(curdir); //使cudir变成当前工作目录
return 1;
}
/* 删除目录函数 */
int delsub(char *dn)
{
struct ffblk b;
int a,done;
char *p;
p=searchpath(dn); //取dn的绝对路径
push(p); //将目录压栈
chdir(p); //使p变成当前工作目录
if((stricmp(delcurdir,p)==0)||(strstr(delcurdir,p))) // 如果是删除盘的当前目录或它的父目录
{
printf("目录%s不能被删除\n",strlwr(p));
return -1;
}
done=findfirst("*.*",&b,55); //搜索磁盘目录,取得下一个匹配的findfirst模式的文件
while(!done)
{
if(b.ff_attrib&FA_DIREC) //如果是目录
{
if((strcmp(b.ff_name,".")!=0)&&(strcmp(b.ff_name,"..")!=0))//排除"."和".."两个特殊目录
delsub(b.ff_name); //调用删除函数
}
else
{
_chmod(b.ff_name,1,FA_ARCH); //设置文件属性,去掉文件其他属性
unlink(b.ff_name); //删除文件b.ff_name
}
done=findnext(&b); //查找向匹配的文件
}
chdir(".."); //改变工作目录
pop(p); //目录出栈
a=rmdir(p); //删除文件目录P
return a;
}
/* 压栈函数 */
void push(char *p)
{
int len;
len=strlen(p);
stack[sp]=(char *)malloc(len+1); // 因为字符串结束符\0也占存储位置,所以分配内存时多分配一个
if(stack[sp]==NULL)
{
printf("Not enough memory!\n");
exit(-1);
}
strcpy(stack[sp],p);
sp++; //计数器加1
}
/* 出栈函数 */
void pop(char *p)
{
sp--;//计数器减1
strcpy(p,stack[sp]);
free(stack[sp]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -