i社区用户: 密码:
搜索:
首页| 资讯| 信息化| 产品| 专题| 创业| 技术天地| 企业中心| 企业论坛| 职场| 周报全文| 商城| 市场
会展| Blog| i社区| 社区联盟| RSS| 电子杂志| 发行| 直播| IT两会| i| 下载| 上网导航| CIO俱乐部

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 属性值及含义
十六进制 二进制(b7b0)  十进制 含义
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 复合属性值及含义
十六进制 二进制(b7b0) 十进制 含义
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.fffdate
year=xx/512;
xx=xx%512;
month=xx/32;
day=xx%32;
xx=inform.ffftime;
hour=xx/2048;
xx=xx%2048
min=xx/32;
sec=xx%32;
j=inform.ffattrib;
M=12strlen(inform.ffname);
printf(“%s”,inform.ffname);
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.fffsize,month,day,year
+1980,hour,min,sec,attrl[j]);}
else
printf(“%9ld %2u%2u%4u %2u:%2u’%2u %3
s\n”,inform.fffsize,month,day,year+198
0,hour,min,sec,attrl[j33]);totb+=infor
m.fffsize;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.IIname);
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
中国计算机世界出版服务公司版权所有