分享

快速删除目录树的程序

 wkwable 2010-08-31

快速删除目录树的程序

http://articles./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 <stdio.h>
#include <dos.h>
#include <dir.h>
#include <alloc.h>
#include <string.h>
#include <stdlib.h>
#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:]<\><directory name>");
exit(1);
}
/* 目录压栈 */
void pushdir(char *p)
{
int len;
if (stpoint<DIRLEN) {
len = strlen(p);
stack[stpoint]=malloc(len+2);
if (stack[stpoint]==NULL) {
printf("Error : Not enough memory !\n");
exit(1);
}
strcpy(stack[stpoint],p);
stpoint++;
}
else {
printf("Error : Stack overflow !\n");
exit(1);
}
}
/* 目录出栈 */
void popdir(p)
char *p;
{
stpoint--;
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]);
}
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多