|
||||
DOS目录属性超级管理方法 马尚玮 魏和平 甘肃省自考办计算机室 730030马尚玮 |
|
一、目录结构及属性 DOS操作系统下规定的目录包括文件目录、子目录及卷标,卷标由FORMAT命 令格式化磁盘时带参数/V形成。所有的目录由32个字节组成,其格式如图1所示。各 字节的含义如下:(字节位移用十进制表示)0 7 8 10 11 12 21 22 2526 27 28 31图1 目录结构 第0-7字节表示文件名(或子目录名),其中第一字节(0字节)表示该目录项的 状态: 00H表示该目录没有使用过 E5H表示该目录已经被删除。 2EH表示该目录为子目录项。 该字节除以上三种状态外,其它任何字符表示一个文件名(或子目录名)的第一个字 符。 第8-10字节表示文件的扩展名。 第11字节表示文件的属性,该属性字节(8个二进制位)的结构如图2所示。 b7 b6 b5 b4 b3 b2 b1 b0 x x 档案位 子目录 卷标 系统 隐藏 只读 图2 属性字节结构 DOS系统规定属性字节的低6位(b5~b0)有效,属性值及含义见表1。 表1 属性值及含义 十六进制 二进制(b7b0) 十进制 含义 00H 0000 0000 0 读/写 01H 0000 0001 1 只读 02H 0000 0010 2 隐藏 04H 0000 0100 4 系统 08H 0000 1000 8 卷标 10H 0001 0000 16 子目录 20H 0010 0000 32 归档 其中档案位是用于记录DOS中某些命令的执行而设置的特征位。一个文件完成了写 操作并存盘,系统就为其自动设置归档属性(b5位置1)。 第12-21字节未用。 第22-25字节表示文件的建立时间(其中22、23两字节表示时、分、秒,2 4、25两字节表示月、日、年)。 第26-27字节表示文件的起始簇号。 第28-31字节表示文件的长度(字节数)。 文件属性规定了文件的存取权限。只读文件规定用户只能读该文件,但不能打开该文 件写入信息,同时也不能删除;隐藏文件和系统文件在通常的目录查找中不被列出,也不 能读/写和删除,但不影响文件的正常运行。 一个文件(或子目录)除具有上述六种属性中之一外,还可以同时有几种属性,即复 合属性。复合属性值及含义见表2。 表2 复合属性值及含义 十六进制 二进制(b7b0) 十进制 含义 03H 0000 0011 3 只读+隐藏 05H 0000 0101 5 只读+系统 06H 0000 0110 6 隐藏+系统 07H 0000 0111 7 只读+系统 +隐藏 0AH 0000 1010 10 卷标+隐藏 12H 0001 0010 18 子目录+隐藏 除读/写属性外,其它文件属性可以加归档属性也可以不加。若加归档属性其属性值 和含义见表3。 表3 含归档属性的文件属性值及含义 十六进制 十进制 含义 21H 33 只读+归档 22H 34 隐藏+归档 23H 35 只读+隐藏+归档 24H 36 系统+归档 25H 37 只读+系统+归档 26H 38 隐藏+系统+归档 27H 39 只读+系统+隐藏+归档 如MSDOS.SYS的属性值为27H=01H+02H+04H+20H,表示 该文件具有只读+隐藏+系统属性并归档。对一个子目录来说,如果将其属性字节中的b 1位置为1变为12H或将b2b1b0三位全置为111变为17H,该子目录就变为 隐藏目录,在DIR命令下不显示。 利用文件属性,可以对有关文件(或子目录)进行加密保护,提高信息的安全性。 二、目录属性的一般管理 DOS操作系统中只有文件的只读和归档属性是开放式的,用户可以通过外部命令A TTRIB查看和设置。归档属性的设置只有用DOS 3.3及其以上版本中的ATT RIB命令才能实现。文件的其它属性的查看和设置,仅依靠DOS提供的内、外部命令 是无法实现的,通常借助DEBUG调试程序或PCTOOLS等工具软件来实现。前者 一般人员不易实现,后者由于系统庞大,占内存多,启动慢,同时就设置文件属性而言, 只能对单个文件操作,过于繁琐。 三、目录属性超级管理方法及程序设计 这种管理思想是让用户对文件、子目录的属性进行方便灵活的管理。既弥补了DOS 系统中ATTRIB命令的不足,又克服了使用DEBUG、PCTOOLS等工具软件 的繁琐。目录属性的查看就像DOS命令DIR一样,可以显示出任一目录下单个文件( 子目录)或一类文件(子目录)的文件名、文件大小(字节数)、建立日期、建立时间及 文件属性。文件属性的重新设置很灵活,既可以对单个文件操作,也可以对一类文件操作 。即文件名中可以用通配符“*”和“?”。文件属性显示及设置均以代码出现。属性代 码及含义见表4。 表4 属性代码含义 代码 含义 代码 含义 C 读/写 L 卷标 R 只读 D 子目录 H 隐藏 A 档 S 系统 在设置文件属性时,属性代码用R、H、S、A及它们的组合。 根据该管理思想,笔者编写了一个程序FATTRIB.C,在Turbo C2. 0下编译通过。该程序使用方法为: 1.FATTRIB<文件名> <CR>;查找与“文件名”相匹配的所有文件, 并显示文件名、文件大小、建立日期、建立时间及文件属性。 2.FATTRIB<文件名> <属性> <CR>;设置文件属性。 如:FATTRIB *.BAT<CR>显示当前目录下所有.BAT文件的各项 属性。 FATTRIB■AUTOEXEC.BAT ARH<CR>;设置根目录下AU TOEXEC.BAT文件的属性为“只读+隐藏+归档”。 注意:属性代码的输入无次序要求。 /*FATIRIB.C*/ #include<stdio.h> #include<dir.h> #include<dos.h> #include<ctype.h> #include<string.h> main(int argc,char *argv□) { char *p,name [MAXPATH],path[ MAXPATH]; static char attrl□[4]={“C”,“R”,“H”,“RH” ,“S”,“RS”,“HS”,“RHS”,“V”,“D”,“A”,“VH”,“ DH”};static char attr2□[5]={“AR”,“AH”,“ ARH”,“AS”,“ARS”,static char attr2□[5]={ “AR”,“AH”,“ARH”,“AS”,“ARS”,“AHS”,“ARHS” };static int fatt□={32,1,2,4}; unsigned year,month,day,hour,min,sec,xx ;int i,j,done,fa=0,k,M,cnt=0; long totb=0; struct ffblk inform; strcpy(path,argv[1]); p=strrchr(path,’■’); if(p==NULL) {p=strrchr(path,’:’); if(p==NULL)path[0]〕=’\x0’; else *p=’:’;} else *p=’■’; *(p+1)=’\x0’; if(argc==2) {p=&argv[1][0]; done=findfirst(p,&inform,55); if(done){ printf(“File not found.\n”);exit(0);} printf(“Directory of %s\n”,path); printf(“Filename Lengt Date Time Attr ib\n”); while(!done) { xx=infom.fffdate year=xx/512; xx=xx%512; month=xx/32; day=xx%32; xx=inform.ffftime; hour=xx/2048; xx=xx%2048 min=xx/32; sec=xx%32; j=inform.ffattrib; M=12strlen(inform.ffname); printf(“%s”,inform.ffname); for(i=0;i<M;i++)printf(“%s”,“”); if(j<=32) {if(j==10) j=11; if(j==16) j=9; if(j==18) j=12; if(j==32) j=10; printf(“%9ld %2u%2u%4u %2u:%2u’%2 u %3s\n”,inform.fffsize,month,day,year +1980,hour,min,sec,attrl[j]);} else printf(“%9ld %2u%2u%4u %2u:%2u’%2u %3 s\n”,inform.fffsize,month,day,year+198 0,hour,min,sec,attrl[j33]);totb+=infor m.fffsize;cnt+=1; done=findnext(&inform); } printf(“/n”); printf(“%10s%d FILE(s) in %ld byte(s)/n ”,“”,cnt,totb);else if(argc==3) {p=&argv[1][0]; done=findfirst(p,&inform,39); if(done){ printf(“File not found.\n”); exit(0);} while(!done) {strcpy(name,path); strcat(name,inform.IIname); for(i=0;i<=3;i++) {for(k=0;k<=3;k++) if(toupper(argv[2][i]==attr2[6][k])fa +=fatt[k]; chmod(name,1,fa); } fa=0; cnt+=1; done=findnext(&inform); } printf(“\n”); printf(%20s%d FILE(s) attribed\n“,”,c nt); } } (计算机世界报 1994年 第7期) |
周报全文频道联系方式:010-68130909 |
||||||
| 【关于我们】 【广告服务】 【周报发行】 【投稿指南】 【投稿声明】 【联系方式】 【法律声明】 【媒体手册】 【编读往来】 |
||||||
| Copyright© ccw.com.cn,All rights reserved | ||||||
| 中国计算机世界出版服务公司版权所有 | ||||||