Programming and Application(编程与应用)


Content(目录)




Linux


MySQL
Office















 
PCNow 30-Day Free Trial, Remote PC Access
 
Logo_234x60

快速删除目录树的程序


快速删除目录树的程序

在我们使用计算机的过程中,经常会遇到要删除既含有文件又含有子目录的目录树的情况。对于目录树的删除
,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]);
      }
}
©董占山Zhanshan Dong

Post comments(留言)

Name(名字):

Comment(内容):


由Google提供

SunfineData Products|U's Bargain Network|Contact Me(与我联系)
© 1998-, 董占山, 版权所有, 欢迎转载文章链接。
转载文章和软件请注明出处(http://articles.sunfinedata.com/)。