快速删除目录树的程序

来源:百度文库 编辑:神马文学网 时间:2024/04/27 17:05:27

快速删除目录树的程序

http://articles.sunfinedata.com/cpro/DELTREE.html
在我们使用计算机的过程中,经常会遇到要删除既含有文件又含有子目录的目录树的情况。对于目录树的删除,MS DOS 6.0及以后的版本提供了一个非常有用的命令DELTREE,但对6.0以下的DOS系统,要删除一个含有子目录的目录,则还必须这样作:进入最末一级子目录,然后一级一级地删除子目录下的文件以及子目录。这种操作过程不仅麻烦而且浪费时间,在遇到子目录下含有只读文件时,还要先修改文件属性再删除之。我设计了一个可以方便地删除磁盘目录的程序DELTREE.C。一、程序设计的原理对任意一个目录树,要删除它就要对其进行遍历,其算法是:先从根结点开始往下查找,遇到文件删除文件,遇到子目录就将子目录压如堆栈,当遍历整个目录之后,如果这个目录为空,就删除它;否则,遍历其子目录,直到删除其所有的子目录,然后再删除它;最后回到根结点的父目录,删除该目录。TURBO C 2.0提供了丰富的对磁盘文件进行操作的函数,其中findfirst()和findnext()可以用来完成对磁盘文件的搜索,删除文件则可以使用unlink()函数来完成,用rmdir()可以删除子目录。利用这些函数提供的功能,笔者用TURBO C 2.0编写了一个可以删除目录树的程序DELTREE.C,可以完成与MS DOS 6.0提供的DELTREE.EXE相当的功能。二、程序的使用方法该程序的命令行格式为:DELTREE [d:][\path]其中,驱动器符是可以省略的。执行程序时,程序首先询问用户是否真的要删除这个目录树,如果是,就回答"Y",那么目录树就会被删除。如果在执行程序时,没有提供命令行参数,程序会显示使用方法。如执行:  DELTREE C:\DONG <回车>将删除名为C:\DONG的目录树。三、源程序清单/*************************************************************//*  程序名称: DELTREE.C 1.00                                 *//*  作    者: 董占山                                         *//*  完成日期: 1995                                           *//*  用    途: 快速删除目录树                                 *//*  编译方法: 用下列命令编译连接可以得到DELTREE.COM:         *//*  tcc -mt deltree                                          *//*  tlink c:\tc\lib\c0t+deltree,deltree,,c:\tc\lib\cs\lib /t *//*************************************************************/#include #include #include #include #include #include #define DIRLEN 500   /* 最大栈深度 */char *stack[DIRLEN]; /* 目录栈 */int stpoint = 0;     /* 栈深度 *//* 回答是否的函数 */int YesNo(s)char *s;{char c;printf("%s (Y/N)?",s);do {c = toupper(getchar());} while ((c!='Y') && (c!='N'));if (c=='Y') return 1;else return 0;}/* 显示程序的使用方法 */void help(){printf("\n%s\n%s\n","Usage  : delete a directory tree","Syntex : DELTREE [d:]<\>");exit(1);}/* 目录压栈 */void pushdir(char *p){int len;if (stpoint=0) {strcpy(p,stack[stpoint]);free(stack[stpoint]);}}/* 处理目录或文件: 把目录压入堆栈, 或者把文件删除 */int processitem(f,curdir,len)struct ffblk f;char *curdir;int len;{int r;if (f.ff_attrib == FA_DIREC) {  /* 目录压栈 */if (f.ff_name[0] != '.') {r = 1;strcpy(curdir+len,f.ff_name);pushdir(curdir);}}else {if (f.ff_attrib != FA_ARCH) /* 删除文件 */f.ff_attrib=FA_ARCH;strcpy(curdir+len,f.ff_name);if (unlink(curdir)==0)printf("File <%s> is deleted.\n",curdir);}return r;}/* 遍历当前目录 */int finddelete(){char curdir[MAXDIR];int len,r=0;struct ffblk b;getcwd(curdir,sizeof(curdir));pushdir(curdir);len = strlen(curdir);strcat(curdir,"");if (strlen(curdir)!=3) curdir[len++] = '\\';findfirst("*.*",&b,FA_DIREC|FA_HIDDEN);r = processitem(b,curdir,len);while(! findnext(&b)) r = processitem(b,curdir,len);if (! r) popdir(curdir);return r;}/* 遍历目录树 */void deltree(argv)char *argv;{char prompt[81],buf[MAXDIR],oldcurdir[MAXDIR],deldir[MAXDIR],*p;int deldrive,olddrive;getcwd(oldcurdir,sizeof(oldcurdir));olddrive = getdisk();if (argv[1]==':') {deldrive = toupper(argv[0])-'A';argv += 2;}strcpy(deldir,strupr(argv));sprintf(prompt,"Are you sure to DELETE the directory <%c:\%s>",deldrive+'A',deldir);if (YesNo(prompt)==1) {setdisk(deldrive);if (chdir(deldir)) {printf("Error : Not exist such directory !\n");setdisk(olddrive);exit(1);}pushdir(deldir);do {if (! finddelete()) {getcwd(deldir,sizeof(deldir));strcpy(buf,deldir+2);p = strrchr(deldir,'\\');*p=0;if ((strlen(deldir)==2) && (deldir[1]==':')){ *p++ = '\\'; *p=0; }chdir(deldir);if (rmdir(buf)==0)printf("Directory <%s> is removed.\n",buf);}popdir(buf);strcpy(deldir,buf+2);chdir(deldir);} while (stpoint);setdisk(olddrive);chdir(oldcurdir);}}/* 主程序 */main(argc,argv)int argc;char *argv[];{printf("DELTREE version 1.0 Copyright (c) 1991,95 Dong Zhanshan\n");switch (argc) {case 1 : help();break;case 2 : deltree(argv[1]);}}