显示文件目录及其部分内容的程序
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;
}
}
|