FDT 文件目录表
Introduction
Format 格式化时,已对磁盘建立了一个根目录 FDT(File Directory Table)。
- 在根目录下用户可以创建不同子目录或文件 根目录下的所有文件及其子目录有一个目录登记项。The directory entry of directory indicated the root directory address and its length is 0 byte. The directory entry of files indicates the data address.
- 根目录以及各个子目录都有自己的 FDT(文件目录表)。
- DOS 中用“[盘符:] ”表示根目录
- 注意: 我们讨论的默认是 x86, 采用小端模式,高字节高地址存储。
由于 FAT16 与 FAT32 有些区别,所以下面我们分开讲述。
FAT16's FDT
在 FAT16 分区格式中,FDT 表的长度是固定的,为 32 个扇区
- 每个目录登记项 32 个字节,分 8 个区域,提供文件目录信息。
- 最多保存 512 个文件或子目录。
扇区个数(32)*每个扇区大小(512)=每个目录项大小(32 字节)*目录项最大个数(512)
Layout
下面介绍一些此格式中重要的部分:
文件状态: 0 字节偏移 第一字节(0 号字节),表示当前文件的状态。 | 值 | 含义 | | ------- | ---------------------- | | 00H | 目录项空表项(未使用) | | E5H | 曾使用过,但已删除 | | 2EH | "." 当前目录 | | 2EH 2EH | ".." 上一级目录 |
属性字节: 11 字节偏移
属性字节中是比特位对应属性 多种比特位的值表示其有多种属性,例如: 系统隐含常常和文件或目录一起存在。 示例:
- 系统隐含文件: 0010 0110H = 26
- 系统隐含子目录: 0001 0110H = 16 常见属性字节与值: | 值 | 类型 | | --- | -------------- | | 20 | 档案(文件) | | 10 | 子目录 | | 08 | 卷标 | | 16 | 系统隐含子目录 | | 26 | 系统隐含文件 |
卷标
- 是一个磁盘的一个标识,不唯一。由格式化自动生成或人为设定。仅仅是一个区别于其他磁盘的标识而已。
- 卷标也占用一个目录登记项
- 可以看出卷标,子目录和文件用的是不同比特位,所以计算文件个数的时候不要算卷标,子目录哦
子目录
- DOS 采用层次目录,树型目录结构。子目录和文件一样都有目录登记项,子目录的目录名和文件名表示方式基本一样,目录登记项中:日期、时间、起始簇表示方式一样, 只有属性和长度表示不同,长度固定为 0。
- 根目录由 DBR 确定,而子目录由根目录下的目录登记项确定,如果我们要分析子目录下的东西,需要去子目录的 FDT 去看。
- 系统通过
.
和..
实现目录间的双向联系,使目录能在目录之间进行切换 - 子目录比根目录多两个目录项,即
.
和..
,.
表示当前子目录,..
表示当前子目录的父目录
文件首簇号
文件长度
剩余扇区数计算
系统在分区时会以柱面为分隔面,将同一柱面的扇区划分在一个分区内。划分 5 个区域的过程,容易出现 DATA 扇区不是一个整数,即有少于一个簇的扇区
根据 DBR 知道,每簇 32 个扇区, 保留扇区 4 个,扇区总数 1060227,此外,FDT 大小为 32 个扇区。
DATA 区的扇区数(包含剩余扇区) = 1060227–4–130x2–32 = 1059931
DATA 区的簇数(包含剩余扇区) = 1059931 / 32 = 33122.84375 约等于 33122
那么,剩余扇区数 = 1059931-33122×32 = 0.84375 x 32 = 27 即剩余扇区数为 27
FAT32's Directory
FAT32 中目录不再单独占有一块区域,可认为是数据区的一部分, 其大小可变,不再像 FAT16 一样固定扇区了。此外,根目录改成了根目录文件。
- 根目录文件数据不受 512 个限制
- 根目录初始定为 1 个簇的大小,若空间不够,FAT 为根目录追加新的簇
- 原则上 FAT32 允许根目录位于数据区中的任何位置,通常位于 2 号簇。
- 所有簇从 2 号开始依次编号。2 号簇不是位于文件系统开始处,而是位于数据区,寻找 2 号簇方法比较繁琐。
- 数据区以前的区域不能使用 FAT 表管理,因此只能使用扇区地址
- FAT32 目录区的文件目录项包括:
- 文件目录项
- 子目录项
- 卷标项(仅根目录有)
- 已删除目录项
FAT32 的目录登记项通过利用 FAT16 的目录登记项中的保留未用部分,实现了扩容。具体见下图:
图中我用绿色深线框选的便是原来在 FAT16 中的保留未用部分。 注意: FAT32 的目录登记项中簇号由两部分组成: 起始簇号的高 16 位和起始簇号的低 16 位
长文件名
FAT32 支持长文件名。
长文件名的实现:
- 除一些磁盘工具外,多数程序通过操作系统获取文件名和目录名
- 若设置文件属性为 0FH,DOS 和 Windows 3.x 会忽略该目录项
- 解决长文件名与 DOS,Win 3.x 兼容性问题
Windows95 系统中,文件或目录设计存储两个名字,即短文件名和长文件名。其中长文件名对应的短文件名 处理原则:
- 取长文件名前 6 个字符加“~1”,扩展名不限
- 若已存在该名字,则“~”后的数字自动增加
- 若有 DOS,Win 3.x 非法字符,用 “_” 替代
这就意味着如果一个文件或者目录的名字过长,他们的目录登记项就至少有 4*16 = 64 字节的长度,其中,短文件名部分格式与之前介绍的一致。
长文件名部分,我们需要关注的有以下几部分:
- 长文件名部分也是以 32 个字节为一个内部小单位,进行标识。
- 0 号字节(第一个字节) 1 号比特(从 0 开始)为 1 表示这是长文件的最后一个登记项(也就是这个长文件名目录登记项到此结束) 3-7 号比特,表示这是长文件名目录部分的第几部分,也就是顺序号。
- 11 号字节(第 12 个字节) 属性字节为 "0F" 表示该项为长文件名
- 31 号字节(第 14 个字节) 同一文件标号,该字节相同表示这是同一个文件的长文件名部分。
下面我们详细地分析一个长文件名:
重要部分已标识,下面一一分析。
最左侧一列。
我们可以看到结束处为: 43H = 0100 0011B, 即: 1 号比特的 "1" 标识长文件名结束,后面五个字节为长文件名目录登记项的长文件名部分的顺序号,从 1 开始。我们从下向上看,可以看到 1 2 3 说明长文件名部分有 3 个,也就是该长文件名目录登记项大小
3*32 + 32 = 128 字节
“0F” 作为长文件名部分的标识符。
“08” 同一个文件的标识符
也就是说 32 个字节小单位的对应位置上的字节相同,说明它们是同一个长文件名部分。
短文件名部分
再强调一下:起始簇号是位于两个部分,要连起来即可。
长文件名目录登记项的识别?
它区别于普通的 FAT32 短文件名目录登记项的特征有以下三点:
- 每 32 个字节的第一个字节的 3-7 位的值,即:顺序号
- "0F" 长文件名部分的标志
- 同一文件标识符,一行的倒数第三个字节
- winhex 右侧栏字符中的波浪线
根据右侧字符栏看文件名
由于格式中一些字节的影响,太过复杂的长文件名看右侧字符栏应该读不太准。不过,想来,考试或平时只需要看些简单的或者简单了解一下名字而已。
以上图的长文件名为例子: 短文件名部分,只有第一行读取短文件名,这里是: 007286~1GIF 长文件名部分(完整的文件名),每两行(32 个字节)为一个单位。读法: 单元间由下到上,单元内从上到下,从左往右。 这里是: 007286Telylgc 8j3iqlxmg307s 0d54qw.gif 读取长文件名时,要注意长文件结束字节(这里为 43) 的字符影响,一般该行第一个字符去掉。
长文件名实现注意事项:
- 长文件名占用较多的目录登记项,目录登记项数据一般为 512 个
- 在根目录下最多能存储 46 个这样的长文件或目录
- 使用 16 位应用程序时,更改文件名,对应的长文件名将丢失
- 长文件名更名或删除时,长文件名将丢失,长文件名依附的短文件名存在
- 频繁创建和删除长文件名,会造成大量磁盘碎片 避免方式
- 不在根目录下创建长文件名
- 磁盘碎片整理程序回收丢失的目录登记项
未完待续..