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

📄 1.cpp

📁 删除目录树的一个小程序 需要在tubroc环境下运行
💻 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 + -