◆ 最后访问时间,精确到日。
◆最后修改时间,精确到2秒。
提示:对于如何对时间值进行更新并没有详细的规定,所以每种操作系统都是根据自己的方式对各个时间值进行更新。Win 95+和NT+会更新所有的时间,但DOS和Win 3.1则只对最后修改时间进行更新。时间值对应于当地的时区。
一个目录项是否被分配使用由它的第一个字节来描述。对于已分配使用的目录项, 它的第一个字节是文件名的第一个字符,而文件或目录被删除后,它所对应的目录项的第一个字节将被设置为OxE5,这就是为什么有的FAT数据恢复工具需要用户自己输入文件名的第一个字符的原因。
注意:操作系统在遍历一个目录时,如果发现某个目录项的第一个字节为Ox00,则认为该 目录下的所有目录项已被检索完毕而不再继续向下检索。所以如果使用十六进制编辑软件将某个目录项的第一个字节手工改为Ox00,则从该目录项开始向后的所有目录项所对应的文件或文件夹将会无法在系统中看到,但由于其FAT项依然在在,所以文件不会丢失也不会被覆盖,这种方法可能会被某些用户用于隐藏数据。
3 短文件名目录项的数据结构
每个短文件名目录项占用32个字节,其数据结构如表3.3所示。 表3 3短文件名目录项数据结构 偏移字节 字节数 (十六进制) 00~00 1 含义 文件名的第一个ASCII码字符,在某些情况下作为该目录项的分配状态值:如果为Ox00,则说明该目录项未被分配使刚过。如果该处的值为OxE5,则表示该目录项曾经被分配使用过,但它原来指向的文件或子目录已经被删除 01~0A 0B~0B 0C~0C 0D~0D 0E~0F 10~11 12~13 14~15 10 1 1 1 2 2 2 2 文件名的第2至11个ASCII码 文件属性: Ox01-只读, Ox02-隐藏,Ox04—系统文件,Ox08-卷标,Oxl0-目录,Ox20-存档。 保留未用 建立时间(十分之一秒) 建立时间(时,分,秒) 建立时间 最后访问时间 文件内容起始簇号(4个字节)的高两个字节(FAT12/16文件系统将此两个字节设置为0,因为它们只使用2个字节描述起始簇号,不使用此处的高位置) 16~17 18~19 1A~1B 1C~1F 2 2 2 4 最后修改时间(时,分,秒) 最后修改日期 文件内容起始簇号的低两个字节 文件内容大小字节数(子目录不使用大小值,设置为0)
具体解释如下。
(1) OxOO-Ox00:1个字节,如果该目录项正在使用中,则为文件名或子目录名的第一个字符。
如果为Ox00,则说明该目录项未被分配使刚过。Windows操作系统遇到一个首字节 为Ox00的目录项时即认为后面已没有被分配的目录项,因此如果人为地将此处设置 为Ox00,位于该目录项之后的目录项所描述的子目录及文件将不被操作系统显示给 用户。
如果该处的值为OxE5,则表示该目录项曾经被分配使用过,但它原来指向的文件或 子目录已经被删除,该目录项目前处于未分配状态。
(2)OxOl-OxOA:10个字节,文件名或子目录名的第2-11个字符的ASCII码,除扩展 名外,如果文件的名字部分不足8个字符则用Ox20进行填充。
(3) OxOB-OxOB:1个字节,该目录项所描述的文件的属性,属性值及其含义如下。 Ox01-只读。 Ox02-隐藏。
Ox04—系统文件。 Ox08-卷标。 Oxl0-目录。 Ox20-存档。
当为OxOF时,则是指该目录项的属性,表示该目录项为长文件名目录项。实际上 OxOF是只读、隐藏、系统、卷标这4个标志位的结合,较早版本的Microsoft操作 系统检测到这4个标志位都被设置时,即忽略该目录项,也就是忽略掉长文件名的 存在。
(4)OxOC-OxOC:1个字节,保留。
(5) OxOD-OxOD:1个字节,文件创建时间,精确到创建时刻的十分之一秒。 (6) OxOE-OxOF:2个字节,文件创建时间的时、分、秒。 两个字节的16bit祓划分为三个部分:
0-4bit为秒,以2秒为单位,有效值为0-29,可以表示的秒时刻为0-58。 5-10bit为分,有效值为0-59。 11-15bit为时,有效值为0-23。
例如,某个目录项的偏移OxOE-OxOF字节处的内容为“6CB2”,我们来看一下它表示的时、分、秒时刻。由于FAT文件系统使用Little-endian格式在储多字节数字,因此“6CB2” 表示成十六进制数为OxB26C,换算成二进制为1011001001101100,我们将其分成三部分并 计算它的值,如图3 .18所示。
时 分 秒 bit位 15~11 10~5 4~0 二进制 10110 010011 01100 十进制 22 19 12 时刻 22时19分24秒
(7) OxlO-Oxll:2个字节,文件创建时的日期,16-bit也划分为三个部分
0-4bit为日,有效值为1-31. 5-8bit为月,有效值为1-12。
9-15bit为年,有效值为0-127,是—个相对于1980年的年数值,也就是说该值加 上1980即为文件创建时刻的日期值。也就是可以表示1980-2107年间的任何个 年份。
例如,前面分析时间值的目录项,其OxlO-Oxll字节处的值为“8639”,我们来看下 它表示的日期——同样, “8639”表示的十六进制值为Ox3986,换算成二进制为 11100110000110,按规则划分成三部分并计算它表示的日期,如图3.19所示。
时 分 秒 bit位 15~9 8 ~5 4~0 二进制 11100 1100 00110 十进制 28 12 6 日期 2008年12月6日
(8) Ox12-Ox13:2个字节,最后访问下日期,即最后访问文件的日期,除打开查看文件外,查看其属性、对其进拷贝都会导致该日期值被更新。该值日期的表示方法与文件创建日期的表示方法相同。
[9) Ox14-Ox15:2个字竹,文件起始簇号的高两个字节。
(10) Ox16-Ox17:2个字节,文件最后修改时的时间(时、分、秒),表示方法与创建时刻相同。
(11) Ox18-Ox19:2个字符,文件最后被修改时的日期,表示方法与创建时的日期表示方法相同。
(12) OxlA-OxlB:文件内容起始簇号的低两个字节,与 Ox14-Ox15字节处的高两个字节组成文件内容的起始簇号值。假如Ox14-Ox15字节处的内容为“01 00\,OxlA-OxlB字节 处的内容为“A5 03”,则其表示的簇号为Ox00 0103 A5= 66469。
(13) OxIC-Oxl下:文件内容的大小字节数,只对文件有效,子目录的目录项此处全部设置为o.但在某些情况下,如果只建立了文件,但并没有写入仟何内容,则系统不会为其分 配簇空间,只为其建立一个目录项,并将文件大小设置为o。
4 短文件名目录项实例分析
我们在一个FAT32文件系统的根目录下创建子一个子目录“子目录1”、一个空的文本 文件“文本文件1”和一个写入了内容的文本文件“文本文件2\我们来看一下它们的目录 项,如图3.20所示。
短文件名目录项
具体分析如下。
(1)第一个加底纹的32字节为“子目录1”的目录项:
> 它的名字只有4个字符,其中有3个汉字和1个数字,每个汉字要使用2个字节表
示,每个数字需耍1个字节,因此共占用了 0x00~0x06的7个字节,分配给文件名 部分的0x07-0x0A字仃使用0x20进行了填充。
> 0x0B字节处的属性值为0xl0,说明该目录项是一个子目录的目录项。
> 0x14-0x15 字节处的簇号高两位为0x0000, ,0x1A-0x1B字节处的簇号低两位为 0x0003,因此该子目录起始于3号簇。
> 因为子目录不使用大小值进行描述,所以0x0C-0x0F字节处的大小值没有使用,全 部设置为0。
(2)第二个加底纹的32字节为“文件1.txt”的目录项:
> 文件的扩展名始终占用目录项0x08~0x0A处的三个字节,因此0x00~0x07处的8 个字节,除“文件1”三个字符占用了前5个字节外,其他的字节用0x20填充。 > 另外,我们可以看到它的大小字节数为0,说明这是一个没有内容的文件。也正因 为它没有内容,所以表示其起始簇号的高两位与低两位全部为0,说明没有为其分
配簇空间。 *注意:我们所指的“没有内容”的文件,是针对没有复杂文件结构的文件格式而言,也就是 说只要我们不写入数据内容,文件的大小就表现为0字节,就不占用存储空间,只是占用目 录项。但像word这种具有复杂结构的文件,只要建立了一个空文件,即便不在文件中写入 用户数据内容,也会为其分配一定的簇空间,因为它的空文件也是由复杂的结构组成的,需 要一定的空间存储它。这就是为什么新建的一个Word文档,不向其中写入内容,它的大小 也不为0的原因。 (3)第三个加底纹的32字节是“文件2.txt\的目录项,它的起始簇号为4,文件内容大 小字节数为32(0x0000001F)。 5.长文件名目录项 前面提到,FAT32文件系统在为文件分配短文件名目录项的同时会为其分配长文件名目 录项。FAT文件系统不将文件名与元数据分开存放,而是将其与文件人小、属性、时间和起
始簇号等信息一起存放在目录项中。在文件名目录项中存放的文件名为8.3命名方式,即8 个字符的文件名再加上3个字符的扩展名。本部分将重点介绍超过8个字符的长文件名如何 在FAT文件系统中进行处理。
文件系统在为文件创建长文件名(Long File Name, LFN)类型的目录项时,并没有舍弃原有的短文件名目录项,具有LFN的文件同时也有一个常规的SFN(Short File Name,短文件名)类型目录项。之所以仍然需要SFN目录项只包含文件的名字,而并不包含任何有关时间、大小及起始簇号等信息,这些信息仍然需要用SFN目录项来记录。
6.长文件名目录项特征
如果一个文件的文件名超过8个字符,则会将其名字截短后为其建立短文件名。将短文件名存储在短文件名目录项中。长文件名则存放在长文件名目录项中。长文件名目录项有以下几个特性:
> LFN和SFN目录项结构在相同的位置有一个属性标志字节,LFN目录项使用一个特定的属性值,以说明它是一个长文件名项。
> 项中的其他字节,使用UTF-16编码,存储13个Unicode字符的文件名,每个字符占用两个字节。
> 如果文件名长于13个字符,则继续为其他分配LFN项,直到够用为止。
> 所有LFN都包含一个校验和,通过这个校验和将其与相应的SFN项关联起来。 > 一个文件的所有LFN项按倒序排列在它的SFN项前面,即文件名的第一部分距离 SFN是最近的。
7.长文件名目录项数据结构
长文件名目录项的数据结构见下表。
长文件名目录项数据结构 字节偏移 (十六进制) 00~00 01~0A 0B~0B 0C~0C 0D~0D 0E~19 1A~1B 1C~1F 字节数 1 10 1 1 1 12 2 4 含义 如果目录项使用中则为序列号;如果未分配则为0x00;如果曾经使用过但目前已删除,则为0xE5 长文件名的第1~5个字符(Unicode),未使用的部分先填充两个字节的“00”,然后用0xEF填充 长目录项属性标志0x0F 保留 校验和 文件名的第6~11个字符(Unicode),未使用的部分先填充两个字节的“00”,然后0xFF填充 保留 文件名的第12~13个字符(Unicode),未使用的部分先填充两个字节的“00”,然后用0xFF填充 详细解释如下。 (1) 0x00-0x00:1个字节,长文件名目录项的序列号,一个文件的第一个长文件名序列号为1,然后依次递增。如果是该文件的最后一个长文件名目录项,则将该目录项的序号 0x40进行“或(OR)运算”的结果写入该位置。如果该长文件名目录项对应的文件或子目录被删除,则将该字节设置成删除标志0xE5。
(2) 0x0l-0x0A:5个字节,长文件名的第1-5个字符。长文件名使用Unicode码,每个字符需要两个字节的空间。如果文件名结束但还有未使用的字节,则会在文件名后先填充 两个字节的“00”,然后开始使用0xFF进行填充。