通用子目录文件显现办法-C / C++-优质IT资源分享社区

admin
管理员
管理员
  • UID1
  • 粉丝30
  • 关注4
  • 发帖数581
  • 社区居民
  • 忠实会员
  • 原创写手
阅读:240回复:0

  通用子目录文件显现办法

楼主#
更多 发布于:2016-05-19 16:24

在用 CHKDS/V

对磁盘子目录及子目录文件进行查找时,因为输出显现信息没有分屏显现,很容易错失需求的信息,并且显现信息没有符号出躲藏的子目录名及子目录文件名,这样就

对进一步的子目录及文件操作带来很多不方便。若辅以管道操作选用CHKDSK/V:|MORE,尽管可

分屏显现,但等待输出时刻过长,并且这时 ^_Break

中止被封闭,效果不尽人意。这篇文章针关于

此选用截获 ^_Break

和分屏缓冲输出技能完结子目录和子目录文件及其特点的显现。

一、完结原理

子目录和子目录文件的查找是经过 C 言语函数 findfirst

和 findnext 选用递归算法完结

的。

子目录和子目录文件的特点是依据特点字来判别。特点字格式如下图所示:

-----------------

|7|6|5|4|3|2|1|0|

-----------------

第 0 位(只读位):取 1 表明只读

第 1 位(隐含位):取 1 表明隐含

第 2 位(体系位):取 1 表明体系

第 3 位(卷标位):取 1 表明卷标

第 4 位(子目录位):取 1 表明子目录

第 5 位(归档位):取 1 表明归档

第 6、7 位:保留未用

在子目录及子目录文件查找的递归调用前,保留 ^_Break

符号并封闭 ^_Break 中止,在正

常完毕或截获 ^_Break 中止(或 ESC 信号)后康复

^_Break 符号,并康复指定驱动器的其时子目

录、其时驱动器以及其时驱动器的其时子目录。

在子目录和子目录文件的分屏缓冲输出显现方面,树立一输出缓冲区

BUFFER[80*25] 来

完结成果信息的分屏缓冲输出。

二、程序功用

本程序功用有分屏显现指定驱动器(缺省时为其时驱动器)、指定目录(缺省时为其时目

录)中的指定文件(缺省时为*.*)及其所包括的子目录和子目录中的指定文件(缺省时为*.*

)。关于子目录显现其子目录名及其特点,关于文件显现匹配的文件名、长度、树立时刻及

特点,最后输出匹配的文件个数及所包括的子目录个数。在查找进程中可按

^_Break 或 ESC 键

退出并回来其时驱动器及其其时目录,若指定驱动器不是其时驱动器则康复指定驱动器的

其时目录。

下面举例说明躲藏子目录的查找。

假定在驱动器 A 上树立子目录 TEMP,用 PCTOOLS 或

NORTON 工具软件将其特点由 10 改为 FF

。这样在 DOS 状态下键入 CD

TEMP,体系会提示犯错。

效果 CHKDSK A:,体系提示:

Cannot CHDIR to A:\TEMP,

tree past this point not

processed

运用本程序,运行成果以为TEMP为一文件,其特点为

HSRALD,表明这是一个子目录,可据

此推猜其为一加密子目录,可进一步用 NORTON

工具软件解密。

三、完结实例

实例是在 386 兼容机、BORLAND C++3.1集成环境和

DOS 6.0 操作体系支持下调试经过,实

现源程序附后。

需求指出的不足是,因为 findfirst 与 findnext

是经过查找目录项区完结其功用的,所以

对一些与 FAT

表不符的躲藏文件及子目录的办法本程序不能见效,主张联系 CHKDSK 运用本程

序。

别的,这篇文章选用的封闭 ^_Break

的办法适用于查找进程,但在屏幕输出进程中不能做到

封闭 ^_Break 中止。若需在查、屏幕输出进程中均封闭

^_Break 中止,可选用 ctrbrk 函数另建

一个 ^_Break 中止效劳程序。

#include

#include

#include

#include

#include

#include

#include

#define ESC 27

#define Ctrl_Break 3

#define PAGE_NUMBER 22

void dir operate (void);

void add_attrib(struct

ffblk);

void

full_screen_operate(void);

char driver [MAXDRIVE]="",dir

[MAXDIR]="";

char file

[MAXFILE]="",ext[MAXEXT]=""

char curdriver,curdir

[MAXDIR];

char

olddriver,olddir[MAXDIR],workdir[MAXDIR];

char FN="*.*";

int

page_sum=0,dir_sum=0,file_sum=0;

char buffer[80*25];

char *buffer_pointer=buffer;

char Ctrl_Bresk_flag;

char attrib="";

main(int argc,char * argv[])

{

curdriver=getdisk();

getcwd(curdir,MAXDIR);

driver[0]=curdriver+`A';

if(argc>2){

printf("Too much

parameters!\n");

exit(0)

}

if(argc==2){

fnsplit(argv),driver,dir,file,ext);

if(strcpy(file)!=0){

strcpy(file,exr,13);

strcpy(FN file);

};

if(strlen(driver)!=0){

setdisk(toupper(driver[0])-`A')

setdisk(toupper(drive[0])-`A')

getcwd(olddir,MAXDIR);

strcpy(workdir,dirver);

if(strlen(dir)!=0)

if(strlen(dir)==1)

strcat(workdir,dir,strlen(dir));

else

strncat(workdir,dir,strlen(dir)-1);

chdir(workdir);

};

}

Ctrl_Break_flag=getcbrk();

setcbrk(0);

dir_operate()

pust(buffer);

setcbrrk(Ctrl_Break_flag);

if(dir_sum-1==0)

printf("No

sub_directories.\n")

else

printf("%d

directories.\n",dir_sum-1)

if(file_sum==0)

printf("No files.\n")

else

printf("%d

files.\n",file_sum);

if(strlen(driver)!=0){

chdir(olddir);

};

setdisk(curdriver);

chdir(curdir);

return(0);

}

void dir_operate(void)

{

struct ffblk dirment;

int done,p,byte_num;

unsigned int

year,month,date,hour minute;

char path[MAXDIR];

/*begin to search all possible

files*/

done=findfirst(FN,&dirment,0x2f);

getcwd(path,MAXPATH);

dir_sum++;

page_sum++;

if(page_sum>=PAGE_NUMBER)

full_screen_operate();

/*write Directory name and its

attribute into buffer*/

byte_num=sprintf(buffer_pointer,"Directory

%s",path);

buffer_poiner+=byte_unm;

byte_unm=sprintf(buffer_pointer,"%6s\n",attrib);

buffer_pointer+=byte_num;

while(!done)

{

page_sum++;

file_sum++;

if(page_sum>=PAGE_NUMBER)

full_screen_operate();

/*write filename and its

length,time,attribute into buffer*/

bytp_num=sprintf(buffer_pointer,"%20s%

8ld",

dor,emt.ff_name,dirment.ff_fsize);

buffer_pointer+=byte_num;

year=(dirment.ff_fdate>>9

&0x7f)+80;

month=dirment.ff_fdate>>5

&0xf;

date=dirment.ff_fdate

&0x1f;

hour=dirment.ff_ftime>>11

& 0x1f;

minute=dirment.ff_ftime>>5

& 0x3f;

byte_num=sprintf(bufferr_Pointer,"%2d-%

02d-%2d",month,date,year);

buffer_pointer+=byte_num;

if(hour>=12){

byte_num=sprintf(buffer_pointer,"%2d:%02dp",hour-12,minute);

buffer_pointer+=byte_num;

}

else{

byte_num=sprintf(buffer_pointer,"%2d:%2da",hour

minute);

buffer_pointer+=byte_num;

}

add_attrib(dirment);

byte_num_sprintf(buffer_pointer,"%6s

\n",attrib);

buffer_pointer+=byte_num;

/*continue to search*/

done-findnext(&dirment);

};

/*begin to search all possible

Directories*/

p=findfirst("*.*",&dirment,0x37);

/*skip Directories.and..*/

if(!p

&&dirment.ff_name[0]==`.')

{

p=findnext(&dirment);

p=findnext(&dirment);

}

while(!p)

{ /* if it is directory,then

operateit*/

if((-chmod(dirment.ff_name,0))&FA_DIREC)

{

chdir(dirment.ff_name);

add_attrib(dirment);

/*skip Directories.and..*/

dir_operate();

chdir("..");

}

/*continue to search*/

p=findnext(&dirment);

}

}

void add_attrib(struct ffblk

dirment)

/*calculate attribute of the

given file/directory*/

{

if (dirment.ff_attrib &

FA_HIDDEN)

attrib[0]=`H';

else

attrib[0]`.';

if(dirment.ff_attrib &

FA_SYSTEM)

attrib=`S';

else

attrib=`.'

if(dirment.ff_attrib &

FA_RDONLY)

attrib=`R';

else

attrib=".";

if(dirment.ff_attrib &

FA_ARCH)

attrib=`A';

else

attrib=`.';

if(dirment.ff_attrib &

FA_LABEL)

attrib=`L';

else

attrib=`.';

if(dirment.ff_attrib

&FA_DIREC)

attrib=`D';

else

attrib=`.';

}

void

full_screen_operate(void)

{

char key_value;

/*output

full_screen_buffer*/

puts(buffer);

printf("Strike ^_C to terminate

or any other key to continue!\n");

asm{

mov ah,7

int 21h

mov key_value,al

}

if(key_value==Ctrl_Break||key_value==ESC){

/*process Ctrl_Break or ESC

keyboard input*/

if (strlen(dirver)!=0)}

chdir(olddir);

}

setdisk(curdriver);

chdir(curdir);

setcbrk(Ctrl_Break_flag);

exit(0);

}

else

printf("Searching!......Please

wait!\n");

buffer_pointer=buffer;

page_sum=0

}

[font=Tahoma  ]

优质IT资源分享社区为你提供此文。 [font=Tahoma  ][font=Tahoma  ]

本站有大量优质C、C++教程视频,资料等资源,包含C,C++基础教程,高级进阶教程等等,教程视频资源涵盖传智播客,极客学院,达内,北大青鸟,猎豹网校等等IT职业培训机构的培训教学视频,价值巨大。欢迎点击下方链接查看。 [font=Tahoma  ][font=Tahoma  ]

C、C++教程视频

优质IT资源分享社区(www.itziyuan.top)
一个免费,自由,开放,共享,平等,互助的优质IT资源分享网站。
专注免费分享各大IT培训机构最新培训教学视频,为你的IT学习助力!

!!!回帖受限制请看点击这里!!!
!!!资源失效请在此版块发帖说明!!!

[PS:按 CTRL+D收藏本站网址~]

——“优质IT资源分享社区”管理员专用签名~

本版相似帖子

游客