编程技术、软件应用与系统模拟

(Programming, Applicaiton and Simulation)



本站目录

 

首页
ASP/Access/IIS
DELPHI/PASCAL
PASCAL高级编程
C语言编程实例
WORD
Excel
MATLAB
MINITAB讲座
Windows
DOS
SAS
生物系统模拟
土壤水分剖析器
其他



镜像站点

 

主站
北美镜象站
欧洲镜象站(1)
欧洲镜象站(2)

本站 Google

[搜索]  [站内导航]
座右铭:
只做有益人类的事
不做有害人类的事


显示文件目录及其部分内容的程序

DOS系统提供的列目录命令DIR,只能列出目录中指定类型的文件的文件名、文件的建立日期和时间、文件的
属性和文件的大小等项目,这在观察文件名有一定特征时是特别有用的,但是,有时我们有许多文本文件,
其文件名又没有一定的特征,这时我们只能使用编辑软件,一个一个地打开这些文件,观察文件的内容,以
查找我们需要的文件,这既费时又繁琐,怎样用一条命令就可以方便地检查出各个文件的特征呢?作者用
TURBO C 2.0编写了一个可以同时显示文件名和文件的属性,又可以显示文件的部分内容的程序XDIR.C,可
以作为对DOS命令DIR的有益补充,方便用户查找文本文件。

一、程序设计的原理

XDIR的主要函数list()的基本设计思路是:
    ⑴用findfirst()函数查找第一个有效的文件;
    ⑵分析文件的属性字节,判断它是否为子目录、二进制文件或其它文件;
    ⑶如果不是子目录和二进制文件,那么打开这个文件,从文件头读指定个数的字符,然后关闭文件;
    ⑷显示文件名称、属性和特征字符串;
    ⑸用findnext()查找下一个有效的文件,转⑵,重复执行,直到没有有效文件为止。

二、程序的使用方法

该程序采用命令行格式:
     XDIR <文件类型> <特征串长度>
其中,“文件类型”中可以包括统配符“*”和“?”,也可以带有路径,“特征串长度”是指显示目录时,
文件名和属性之后所显示字符串的长度,可以取0~65536之间的任意数,所取数字越大,显示的字符串就越长
,甚至可以将文件的全部内容都显示出来。

三、源程序清单

/********************************************************/
/*  程序名称: XDIR.C 1.0                                */
/*  作    者: 董占山                                    */
/*  完成日期: 1995-11-10                                */
/*  用    途: 显示指定文件及其文件头上的若干个字符      */
/*  编译方法: 用下列命令编译连接可以得到XDIR.COM:       */
/*  tcc -mt xdir                                        */
/*  tlink c:\tc\lib\c0t+xdir,xdir,,c:\tc\lib\cs\lib /t  */
/********************************************************/

#include <stdio.h>
#include <string.h>
#include <dos.h>
#include <dir.h>
#include <stdlib.h>
#include <alloc.h>

/* 显示程序的使用方法 */
void help()
{
  printf("Usage  : list specified files and several characters in the head of file\n");
  printf("Syntex : XDIR <filename or directory> <number of ASCII characters>\n");
  printf("Example: XDIR *.C 30\n");
  printf("         XDIR *.*\n");
}

/* 显示错误信息 */
void error()
{
  printf("Error : File not found !!!\n");
  help();
  exit(0);
}

/* 列出指定的文件及其若干标志信息 */
void list(dir,len)
char *dir,*len;
{
  struct ffblk f;
  FILE *f1;
  int attrib,slen;
  char *temp,format[80];
  struct { /* 定义文件建立日期的位段 */
     unsigned day:5;
     unsigned month:4;
     unsigned year:7;
  } *fdate;
  struct { /* 定义文件建立时间的位段 */
    unsigned sec:5;  /* 两秒 */
    unsigned min:6;  /* 分 */
    unsigned hour:5; /* 时 */
  } *ftime;
  char p[MAXPATH],*p1;
  slen = atoi(len)+1; /* 取显示字符串的长度 */
  if (slen==1) {
    slen = 21; /* 缺省时为20个字符 */
    itoa(20,len,10);
    }
  temp = malloc(slen); /* 为字符串分配内存空间 */
  strcpy(p,dir);
  if ((p1 = strrchr(p,'\\'))==NULL) p1=p;
  attrib = FA_ARCH | FA_DIREC | FA_RDONLY; /* 文件的属性 */
  if (findfirst(dir,&f,attrib)!=0) error(); /* 查找第一个有效的文件 */
  do {
    ftime = &f.ff_ftime;
    fdate = &f.ff_fdate;
    if (f.ff_attrib==FA_DIREC) { /* 子目录 */
      strcpy(temp,"<DIR>");
      itoa(20,len,10);
      }
    else if ((strstr(f.ff_name,".COM")!=NULL) || /* 二进制文件 */
	(strstr(f.ff_name,".EXE")!=NULL) ||
	(strstr(f.ff_name,".DLL")!=NULL) ||
	(strstr(f.ff_name,".SYS")!=NULL) ||
	(strstr(f.ff_name,".VBX")!=NULL) ||
	(strstr(f.ff_name,".DRV")!=NULL) ||
	(strstr(f.ff_name,".OBJ")!=NULL) ||
	(strstr(f.ff_name,".BIN")!=NULL) ) {
	strcpy(temp,"BINARY FILE !!!");
	itoa(20,len,10);
	}
    else {
      if (p1==p) p1[0]=0; else p1[1]=0;
      if ((f1=fopen(strcat(p,f.ff_name),"rb"))!=NULL) {
	fread(temp,slen,1,f1); /* 读文本文件的字符串 */
	temp[slen] = '\0';
	fclose(f1);
	}
      }
    strcpy(format,"%-12s %8ld %04u-%02u-%02u %02u:%02u:%02u   %-");
    strcat(strcat(format,len),"s\n");
    printf(format,f.ff_name,f.ff_fsize,
      fdate->year+1980,fdate->month,fdate->day,
      ftime->hour,ftime->min,ftime->sec,
      temp);
  } while (findnext(&f)!=-1);
  free(temp);
}

/* 主程序 */
main(argc,argv)
int argc;
char *argv[];
{
  printf("XDIR version 1.0 Copyright (c) 1995 Dong Zhanshan\n\n");
  switch (argc) {
    case 2 :
    case 3 : list(argv[1],argv[2]);
	     break;
    case 1 :
    default: help();
	     break;
  }
}

© 1998-, 董占山, 版权所有。
转载文章请注明出处(www.sunfinedata.com/articles)。