子目录FDT的簇链结构

在FAT文件系统中的目录结构是层次性的树形结构,根目录下可以包含文件和子目录,子目录下可以包含文件并且还可以再包含子目录。


在FDT中,子目录的管理与普通文件相同,一个子目录文件在FDT表中也占据32个字节的目录项。但是,子目录项中的文件长度总为零,尽管它的文件长度实际上不为零,它的意义在于不能使用不同的DOS读写命令来读写一个子目录文件。
1.子目录FDT中的目录项
当前目录为子目录时,在使用DOS命令DIR列文件目录清单时,通常可以看到前两项特殊文件:
“?”表示当前目录
“??”表示上一级目录
这两项同其它子目录一样也没有长度。“?”项所报告的“首簇号”是子目录FDT第一个扇区所在的簇;“??”所报告的“首簇号”是上一级目录的开始簇号。如果上一级目录是根目录,则该簇号值被置成0。系统利用此结构来实现目录之间的双向联系。
只有当文件需要时,系统才给文件分配数据区空间。存放数据的空间是按每次一个簇的方式来分配的。分配的时候,系统跳过已分配的簇,第一个遇到的空簇就是下一个将要分配的簇,此时系统并不考虑簇在磁盘上的物理位置。同时,文件已被删除后空出来的簇也可以分配给新的文件,这样做可使磁盘空间得到有效的利用。
可以说,数据区空间的使用是在文件分配表和文件目录表的统一控制下完成,每个文件所有的簇在文件分配表中都是链接在一起的。
需要注意的是:若使用DOS命令“MD”在磁盘上建立子目录SUB1,我们在FDT中可查到SUB1目录项的第0字节的值不是2E,而是“S”的ASCII码值53(如表6-7所示),
并且子目录SUB1中的所有文件不占根目录的FDT,而是按SUB1的首簇号2AH在相应的逻辑扇区中建立子SUB1自己的文件目录表FDT。这是因为DOS是将子目录作为一个普通文件的文件目录项来处理的。只是在第11字节的文件属性位设为10H,以表示为子目录项。在文件目录项中的第0字节为2EH,也仅是出现在子目录FDT中的第一、第二两个目录项中(如表6-8所示)。
假设一个FAT16结构逻辑硬盘根目录的文件目录表FDT的起始扇区为129(81H),共32(20H)个扇区。用DEBUG中的命令“L 100 2 81 20”读出硬盘逻辑81H扇区开始的20H个扇区,来查看硬盘根目录的FDT,可得到一个如表6-7所示的根目录文件目录表(FDT)。
表6-7 根目录文件目录表(FDT)

xxxx:0000

xxxx:0010

49 4F 20 20 20 20 20 20-53 59 53 27 00 00 00 00

00 00 00 00 00 00 C0 32-BF 1C 07 00 46 9F 00 00

IO      SYS'...

  .....2....F..

xxxx:0020

xxxx:0030

4D 53 44 4F 53 20 20 20-53 59 53 27 00 00 00 00

00 00 00 00 00 00 C0 32-BF 1C 4F 00 FA 94 00 00

MSDOS   SYS'...

  ......2..O...

xxxx:0040

xxxx:0050

43 4F 4D 4D 41 4E 44 20-43 4F 4D 20 00 00 00 00

00 00 00 00 00 00 C0 32-BF 1C 5B 00 75 D5 00 00

COMMAND COM....

  ......2..[.u.

xxxx:0060

xxxx:0070

53 55 42 31 20 20 20 20-20 20 20 10 00 00 00 00

00 00 00 00 00 00 DD 8C-8B 28 03 00 00 00 00 00

SUB1       ....

  .......(.....


从显示结果可以看出,SUB1表项的第11字节的值为10H,表明SUB1不是一个文件,而是一个子目录,其首簇号为第3簇。
在根目录下的文件或子目录在磁盘上的存储位置(逻辑扇区号)按以下公式计算:
逻辑扇区号=1+2*FAT的扇区数+根FDT+(首簇号-2)*每簇扇区数
所以,子目录SUB1的FDT存放的首扇区号应该是:
首扇区号=1+2*201扇区+32扇区+(3-2)*8扇区
=443扇区(1BBH扇区)
用DEBUG命令"-L 00 2 1BB 1"将第1BBH扇区的SUB1子目录FDT的1个扇区内容读入00开始的内容,然后用"-D 00"命令显示子目录SUB1的FDT部分内容。
2.子目录下FDT表的扩充
根目录FDT表和子目录中的FDT表有两个最大的区别:
?根FDT表的扇区数是固定不变的,所以根目录下能够存放的文件或子目录数量是有限的,而子目录FDT表的扇区数是固定的,因而其存放的文件或目录数量也 没有限制。
?根FDT表的所有扇区在物理上是连续存放的,而子目录FDT表的所有扇区在物理是不连续存放的,这些FDT的扇区之间存在一种逻辑上的链接关系。
我们知道,文件系统是将子目录作为一个普通文件的文件目录项来管理的。FDT中的一个扇区最多只能存放16个文件项,对于子目录FDT的首扇区来说,子目录下的两个特殊目录“?”和“??”要占该扇区的前64字节,也就是说该扇区只能存放14个文件的文件目录项。显然,子目录不止有14个文件,那么14个文件以后的那些子目录中,文件的文件目录项又是存放在什么地方呢?操作系统又是如何查找它们的呢?
与普通文件在FAT中的簇号一样,子目录FDT的第一个扇区的簇号及其扩展扇区的簇号在FAT中也会形成一个簇号链,并且也是以FF8H---FFFH(或FFF8H---FFFFH)作为最后一个FDT扇区的结束标志。
例如,假设一个子目录的FDT共有3个扇区组成,在根FDT中查得该子目录的首簇号为a,再从FAT表中查得该子目录FDT扇区的簇链关系为“a=>b=>c”。假如该子目录下有一个文件Text.txt,系统查找该文件的步骤如下:
步骤1:在根FDT中查得子目录的目录项,从该目录项中得到该子目录的首簇号为a,该簇所在的扇区即为子目录FDT的首扇区。并在该扇区中查找文件Text.txt。
步骤2:如果没有找到,则在FAT表中从簇号a开始查得该子目录FDT的下一个扇区的簇号为b,然后再在该扇区中查找文件Text.txt。
步骤3:如果在簇号b扇区中仍然没有找到,则在FAT表中从簇号b查得该子目录FDT的下一个扇区的簇号为c,然后再在该扇区中查找文件Text.txt。
步骤4:如此继续,直到查到该文件的目录表项。
如果直到该子目录FDT簇链的最后一个扇区仍然没有找到该文件,就报告查找失败。

你可能感兴趣的:(c,command,dos,存储,扩展,磁盘)