FAT32文件系统 - 图文

更新时间:2024-06-01 13:32:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

3.1 文件系统总论

从本章开始,我们将使用几个章节详细介绍各种文件系统的工作原理及结构布局。由于 FAT文件系统是普及面非常广泛的Windows操作系统所使用的一种文件系统,所以我们由FAT文件系统开始。又因为FAT32是日前使用最多的FAT类型文件系统,因此,我们主要以FAT32为对象进行讲解。在正式介绍特定的义件系统前,我们有必要先对文件系统有个大致的了解。

到底什么是文件系统?文件系统就是对数据进行存储与管理的方式。

文件系统是为了长久地存储和访问数据而为用户提供的一种基于文件和目录的存储机制。我们都知道,在使用硬盘存储数据前,首先要进行分区,然后对分区进行格式化。格式 化的过程就是在分区内建立一定的文件系统的过程。一个文件系统由系统结构和按一定规则 存放的用户数据组成,以使计算机可以找到并访问它们。大多数情况下,丈件系统并不依赖 于特定的计算机。

文件系统的种类繁多,每种文件系统都有自己特定的结构和管理数据的方式,但所有的 文件系统也都有-定的共性。在此,我们简单介绍一下文件系统中的一些基本概念和共性。

1数据单元

建立一个文件系统后,就可以进行数据的存储了。数据在写入磁盘或从磁盘读取时每次 操作的数据量称为数据单元,它的大小在建立文件系统时确定。数据单元在不同的文件系统 中有不同的称呼方式,例如FAT和NTFS文件系统中的“簇”,ExtX中的“块(Block)”等, 其实都是一种数据单元。一个数据单元由若干个连续的扇区组成,大小总是2的整数次幂个 扇区。存储数据时,系统以数据单元为单位为其分配存储空间,也就是说,总是为其分配整 数个数据单元大小的空间。

2坏数据单元

坏数据单元也就是包含缺陷扇区的数据单元。许多文件系统可将一个数据单元标记为坏单元,这对于那些没有能力处理错误的老硬盘比较有用。当一个数据单元中出现缺陷扇区时,即使缺陷扇区的数最只有一个,操作系统也会将整个数据单元标记为已损坏,不再分配给文件使用。现在的硬盘可以自己检测到坏扇区的存在并用备用扇区对其进行替换,所以文件系统的这一功能已很少使用。

利用文件系统的坏单元标记功能可以很容易地隐藏数据。许多检查工具并不对文件系统 报告的坏单元进行验证以确认其是否真的存存缺陷,因此用户可以手工将一些数据单元添加 到坏单元列表中,然后将数据隐藏进这些单元内。但许多数据提取工具支持对坏单元列表进 行检测以确认其中是否存隐藏的数据。

3.逻辑文件系统地址

●每个扇区都会有一个LBA地址,也就是物理地址。 ●每个物理卷内的扇区又有一个物理卷地址。 ●在逻辑卷内部的扇区会有一个逻辑卷地址。

建立了文件系统后,文件系统既使用逻辑卷地址,也使用一种“逻辑文件系统地址”。 文件系统存储数据时是以数据单元为存储单位,每个单位被分配一个逻辑文件系统地址。

4逻辑文件地址

对于每个文件来讲,将它按所在的文件系统中数据单元的大小为单位进行分割,分割后的每个部分由0开始进行编号,这个编号就是其对应的数据单元的逻辑文件地址,一个文件前后相邻的两个数据单元在物理上的存储地址可能是不连续的,但它的逻辑文件地址却一定是连续的。

5分配策略

不同的操作系统在为文件分配存储单元时可能会使用不同的分配方法。通常操作系统会

为其分配连续的存储空问,但并不总是能够实现。 白提豇趣出幽螳删剑幽摊甑麟础—捌匕4触划到一一

提示:当文件无法被分配到连续的存储单元时被称为“片段化”,即产生文件碎片。

为文件分配存储单元时的方法或算法,我们称之为“分配策略”,分配策略通常可以分

为三种:第一可用分配策略、下一可用分配策略和最佳分配策略。 (1)笫一可用分配策略,即当为一个文件分配了一个存储单元后还需要继续为其分配时, 操作系统会重新从文件系统的起始处搜索可使用的空间。这种分配方式很容易使文件片段 化,因为文件并不是被作为整体一次性分配连续存储空问的。

举例来讲,假如有一个文件需要4个存储单元,文件系统内的1、2、3、5、10号存储 单元已经有数据,4、6、7、8、9 号存储单元空闲,按第一分配策略为这个文件的4个部分 分配空问时,分配步骤如下。

①第一部分分配到4号存储单元,如罔1所示。

图1 文件第一部分存储在4号存储单元

②为文件的第一部分分配好存储位置后,又从1号存储单元)始向后寻找空位置,找到6 号后分配给文件的第二部分,如例2所示。

图2 文件第二部分存储在6号存储单元

?为文件的第二部分分配好存储位置后,又从1号存储单元开始向后寻找空位置,恰

好这时2号存储单元的文件内容被删除了,就把2号位置分配给第三部分,如图3所示。

图3 文件第三部分存储在2号存储单元

④为文件的第三部分分配刚好存储位置后,又从1号存储单元开始向后寻找孔位置,找到7号存储单元后分配给第四部分,如图4所示。

图4 文件第四部分存储在7号单元

所以这个文件的4个部分存储的位置就是4—6—2—7。

注意:在这个例子中可以看到,2号存储单元中被删除的数据,很快就被覆盖掉了。

因此这种分配策略不只容易使文件片段化,而且也使被删除数据的恢复可能性大大降低。 (2)下一可用分配策略,即为文件分配了一个存储单元后并不再回到卷起始重新寻找可用空间,而是直接向后进行搜索。对于前面的例子,使用下一可用策略进行分配的结果会是4—6—7—8,如图5所示。

图5 第一可用策略为文件分配的存储单元位置

提示:这种分配策略有助于数据的恢复,因为2号位空出后,除非在向后的搜索过

程中没找到足够的分配空间,否则不会很快被覆盖掉。

(3最佳分配策略,即在文件分配空间时,会尽可能找到足够的连续空间以避免其片段化。但这种分配策略需要事先知道文件所需要空间的大小,而且如果以后文件增大需要增加分配单元时,新分配的单元有可能处于其他位置而使该文件片段化。对于前面的例子,使用最佳匹配策略分配时,结果则是6-7-8—9,如图6所示。

图6 最佳分配策略为文件分配的存储单元位置

提示:在使用最佳分配策略进行可用空间搜索时,如果没有找到可以存放下整个文

件的连续空间,就会使用第一可用或下一可用策略进行分配。 每种操作系统会选择对某文件系统使用何种分配策略,有的文件系统也会指定要求使用哪种分配策略,但一般不会强制执行。

6文件更新策略

对数据可恢复性进行分析时,除需要考虑它的分配策略外,还需要考虑到文件更新方式 的问题:

●有的程序在对文件更新时,直接打开原文件,更新后,直接用新文件覆盖原文件进行保存。

●有的程序则是先产生一个原文件的副本,对副本进行更新,然后将副本以原文件名保存在新的位置同时删除原文件.

提示:如果文件的更新方式是在原文件上直接修改并覆盖旧文件,当进行了错误修

改并保存后,原数据将无法恢复。如果文件的更新方式使对副本进行修改并保存为新的文件,然后删除旧文件,当进行了错误修改并保存后,可以试图寻找已被删除的旧文件。

7松弛空间

松弛空问分为两种,一种是数据的结尾与为其分配的空间结束处的未被使用的部分,还 有一种是位于分区结尾的卷松弛空间:

●前面提到,系统在为数据分配存储空间时总是为其分配整数个数据单元大小的空间,但文件的大小未必恰好是整数个数据单元,这样就会在文件结尾与为其分配的存储空间结尾间产生部分未使用的空闲空间,这种空闲空间称为“松弛空间”。

●卷松弛空间位于卷的结尾。--个文件系统的扇区数也可能并不恰好是数据单元的整数倍,因此在卷的结尾也可能会有未被分配数据单元号的空间存在,这部分空间被称为卷松弛空间。

松弛空间中有可能存在以前被删除的数据,这取决于操作系统存储数据时的操作方式。例如,一个文件的人小为100个字节,一个文件系统的数据单元大小为4096个字节,也就 是8个扇区,将该文件存储进这个文件系统时,会为其分配8个扇区的存储空间,但是它只使用了第一个扇区的前100个字节,第一个扇区的后412个字节和后7个扇区都为松弛空间。如图7所示。

图7 松弛空间

提示:因为对磁盘的操作以扇区为单位,所以,虽然文件大小只有100个字节,但

写入磁盘时会一次写入一个扇区的数据。较老的操作系统,象DOS或早期的Windows操作系统通常会直接将内存中的数据填充写入磁盘,现在的操作系统则通常是将第一个扇区的后412个字节用0进行填充。对于后7个扇区,有的操作系统可能会对其进行清零操作,但走部分操作系统不对其进行任何操作,这就有可能在这部分扇区中存在着以前被删除的数据。

8.压缩和稀疏文件

很多文件系统允许对文件进行压缩存储以减少它所占用的数据单元。对于文件,可以存在三种级别的压缩:

●最高级别的压缩式在文件内部发生的,例如lPEG格式的文件它将图像信息进行压缩后保存进文件中,不过文件头是不被压缩的。

●次级别的压缩是使用外部程序对整个文件进行压缩后保存成一个新的文件,当需要使用这个文件时,就必须先对其进行压缩。

●晟后一种,也是最低级别的压缩,是由操作系统进行的压缩处理。操作系统在存储文件时,不为连续为0的部分分配存储空间,以这种方式处理过的文件称为“稀疏文件”。

9.加密文件

为了数据内容的安全与隐私性,文件可以被加密以阻止未被授权的访问。对文件进行加 密可以通过三种方式:

●使用第三方加密程序。读取加密前的文件并对文件内容进行加密后建立一个新的加密文件。

●也可以通过操作系统对文件进行加密。这种加密方式只是对文件内容进行加密,通常文件名、时间值等信息不会被加密。

●还有一种加密方式是对整个卷进行加密。对卷进行加密后,卷中所有的数据都处于加密状态,而不只是文件内容被加密。使用对整个卷进行加密的方式时,不能对包含操作系统的卷进行加密。

10元数据

任何文件或目录,都会有一个名字,我们将其统称为“文件名”。除文件名外,文件或目录还会有其他一些描述信息,如大小、时间信息、是否加密或压缩、存储位置信息等,我们将这些描述信息统称为文件或口录的原数据。

3.2 FAT文件系统概述

FAT(File Allocation Table,文件分配表)文件系统是Windows操作系统所使用的一种文件系统,它的发展过程经历了FAT12、FAT16和FAT32三个阶段。

提示:FAT文件系统的名字由来就是因为它使用文件分配表描述文件系统内存

储单元的分配状态及文件内容的前后链接关系。另外,截止到目前,Microsoft又推出了扩展FAT文件系统exFAT,它在原有FAT文件系统的基础上进行了改进,支持超大容量存储。由于其刚刚推出,对其结构尚未完全清楚,故在本书中将暂不涉及。

●FAT文件系统用“簇”作为数据单元。一个“簇”由一组连续的扇区组成,簇所含的扇区数必须是2的整数次幂,如1,2,4,8,16,32或64。簇的最大值为64个扇区,即32KB。所有的簇从2开始进行编号,每个簇都有一个自己的地址编号。用户文件和目录都存储在簇中。

提示:不只FAT文件系统使用簇做为数据单元,Windows系列的NTFS文件系统也

使用簇做为它的存储单元。不同的是,在FAT文件系统内,簇号由2开始:在NTFS文件系统内,簇号由0开始。

●FAT文件系统的数据结构类型比较少,其中有两种重要的结构——文件分配表和目录项:

◆文件和文件夹内容存储在簇中,如果一个文件或文件夹需要多于一个簇的空问,则 用FAT表来描述如何找到另外的簇。FAT结构用于指出文件的下一个簇,同时也说明了 簇的分配状态。FAT12、FAT16和FAT32这三种文件系统之间的主要区别在于FAT项的 大小小同。

◆FAT文件系统的每个文件和文件夹都被分配一个目录项,目录项巾记录着文件名、大 小、文件内容起始地址以及其他一些元数据。

●在FAT文件系统中,文件系统的数据记录在“引导扇区”中。引导扇区位于整个文件系统的0号扇区,是文件系统隐藏区域(也称为保留区)的一部分,我们称其为DBR[DOS Boot Recordel-DOS引导记录)扇区,DBR中记录着文件系统在磁盘上的起始位置、大小、FAT表个数及大小等相关信息。

●在FAT文件系统中,同时使用“扇区地址”和“簇地址”两种地址管理方式。这是因为只有存储用户数据的数据区使用簇进行管理(FAT12和FAT16的根目录除外),所有的簇都位于数据区内。其他文件系统管理数据区域是不以簇进行管理的,这部分区域使用扇区地址进行管理。文件系统的起始扇区为0号扇区。

提示:FAT文件系统对多字节数据使用Little-endian顺序进行存储。

3.3 FAT文件系统整体布局

总体来讲,一个FAT文件系统可以分为三个部分:保留区、FAT区和数据区(如图8所示)。这三个区域在建立文件系统(格式化)时即被创建,且在文件系统存续期间不可被更改。

图8 FAT文件系统整体布局

●保留区中包含一个重要的数据结构——系统引导扇区(DBR),引导扇区中存储着有关文件系统的重要信息。FAT12和FAT16的保留区通常为1个扇区,也就是引导扇区本身。FAT32的保留区则要多些,并且除0号扇区的引导扇区外,还为其保留了一个引导扇区备份。

●FAT区由两个大小相等、内容相同的FAT表组成,我们将其称为FAT1和FAT2。FAT1紧跟在保留区域之后,FAT2紧跟在FAT1之后。FAT表用以描述数据区中存储单元的分配状态及为文件或目录内容分配的存储单元的前后连接关系。FAT2后面即为数据区的起始位置,数据区被划分成—个个的簇,用于存储用户数据。

注意:FAT12/16的根目录虽然也属于数据区,但并不由簇进行管理,也就是说,

FAT12/16的根目录是没有簇号的,它们的2号簇由根目录之后开始。

提示:FAT文件系统共有三种:FAT12、FAT16和FAT32。FATI2大多用于旧式的软

盘,随着软盘的消逝,FAT12文件系统也几乎难以见到了。随着数据存储容量的剧增,FATI6也正在逐渐淡出人们的视线。因此,我们以FAT32为主要对象进行讲解。然后再对FAT12和FAT16进行简单的介绍。

3.4 FAT32的保留区

FAT32文件系统前部有一个由若干个个扇区组成的保留区,保尉区的大小会记录主引导扇区(文件系统的0{扇区,也称为DBR扇区)中,比较常见的为32、34、或38个扇区。

3.4.1 引导扇区

引导扇区是FAT32文件系统的笫一个扇区,也称为DBR扇区。它包含文件系统的下列基本信息。

(1)每扇区字节数。 (2)每簇扇区数。 (3)保留扇区数。 (4)FAT表个数。

(5)文件系统大小(扇区数)。 (6)每FAT表大小(扇区数)。 (7)根目录起始簇号。 (8)其他附加信息。

提示:DBR扇区中记录文件系统参数的部分也被称为BPB(BIOS Parameter Block)。 ★ 引导扇区中的某些参数是至关重要的,例如文件系统的大小(扇区数)、保留扇区数每

簇扇区数、FAT表的个数及每个FAT表的大小(扇区数)、根目录的起始簇号等。 它们的重要性表现在:

◆ 通过每个FAT表的大小扇区数乘以FAT表的个数可以得到FAT区域的大小。 ◆ 通过保留扇区数和FAT区域的大小就可以得知数据区的起始位置,也就得到了文

件系统第一簇的位置。

◆ 由根目录的簇号和第一簇的位置就可以得到根目录的位置。 ★ 除了布局结构信息外,引导扇区中还有一些非实质性数据。非实质性数据是指那些文件

系统在存取数据过程中并不需要的数据,这些数据只是提供一些附加的信息而己。例如引导扇区巾有一个8字符的“OEM版本号”,这个版本号只是用来说明是什么工具创建了这个文件系统。例如,Windows 95将此处设置为“MSWIN4.0”,Windows 98则设置为“MSWIN4.1”,Windows XP/2000设置为“MSDOS5.0”,Linux的mdfs.msdos则将其设置为“mkdosfs”,一些USB则会取任意值,而有的数码相机中的闪存卡则被设置为相机型号。使川任何十六进制编辑工具都可以改变这个版本值,而且并不影响文件系统的使用。不过这个版本号可以帮助我们识别一张软盘是被哪种机器格式化的,有些版本的系统需要根据此值进行相应的设置。

★ FAT文件系统有一个4字节的卷序号,这个序号是遵循微软定义,将文件系统建立 的时问按一定方式组合而成的。Windows的不同版本所用的操作方式也不同,

Windows 98是将日期和时间按一定顺序相加,而Windows XP则使用不同的计算方 法。Windows还利用这个值对移动媒体进行识别。

★ 引导扇区中还有一个8个字符的类型标志,内容为“FAT12”、“FAT16”、“FAT32”

或“FAT”。大多数工具在创建文件系统时会对此处进行相应的设置,不过此处的 标志是否正确并不影响文件系统的正常运行。因此我们应该计算文件系统的某些特 征数据来确定它的实际类型,而不只是依据此处的标志值。

★ 最后,引导扇区中还有一个11个字符的卷标,这个卷标由用户在创建文件系统的过 程中指定。同时,这个卷标也保存在该卷的根目录中,不过Windows XP则只是将 此卷标存放在根目录中,而并不将其写入引导扇区。 1.引导扇区数据结构

FAT32引导扇区的数据结构如表3.1所示。

表3.1 FAT32引导扇区的结构

字节偏 (十六进制) 00~02 03~0A 0B~0C 0D~0D 0E~0F 10~10 11~12 13~14 15~15 16~17 18~19 1A~1B 1C~1F 20~23 24~27 28~29 2A~2B 2C~2F 30~31 32~33 34~3F 40~40 41~41 字节数 3 8 2 1 2 1 2 2 1 2 2 2 4 4 4 2 2 4 2 2 12 1 1 含义 汇编指令,跳转到引导代码处 文件系统标志(ASCII码) 每扇区字节数,可用值包括512、1024、2048、4096。硬盘一般为512 每簇扇区数,该值为一个2的整数次幂,最大不超过64 保留扇区数 FAT表个数,通常为2,但对于一些较小的存储介质允许只有一个FAT表 根目录最多可容纳的目录项数,FAT12/16通常为512,FAT32不使用此处值,设置为0 扇区总数,小于32MB时使用此处存放。超过32MB时使用偏移0x20~0x23字节处的4个字节存放值 介质描述符 每个FAT表的大小扇区数(FAT12/16使用,FAT32不使用此处,设置为0) 每磁道扇区数 磁头数 分区前已用扇区数,也称为隐藏扇区数,指DBR扇区相对于磁盘0号扇区的扇区偏移 文件系统扇区总数 每个FAT表大小扇区数(FAT32使用此处,FAT12/16不使用) 标记,确定FAT表的工作方式,如果bit7设置为1,则表示只有一份FAT表是活动的,同时由bit0~bit3对其进行描述。否则,两份FAT互为镜像 版本号 根目录起始簇号,通常为2号簇 FSINFO所在扇区号,通常位于1号扇区 备份引导扇区号的位置,通常为6号扇区 未使用 BISO Int 13H设备号 未使用 42~42 43~46 47~51 52~59 5A~1FD 1FE~1FF 1 4 11 8 410 2 扩展引导标识,如果后面的三个值是有效的,则此处的值设置为0x29 卷序列号,某些版本的Windows会根据文件系统建立日期和时间计算该值 卷标(ASCII码),建立文件系统时由用户指定 文件系统格式(ASCII码) 未使用 签名值“55AA” 提示:备份引导扇区总是位于卷的6号扇区,当0号扇区的引导扇区损坏时可以用备份扇区进行恢复。 文件系统信息(FSINFO)扇区中包含有关下一个可用簇及空闲簇总数的信息,这些数据只是为操作系统提供一个参考,并不总是能够保证它们的准确性。 2.引导扇区实例分析 下面我们来分析一个FAT32文件系统的引导扇区,如图3 9所示。

图 3.9 FAT32文件系统的引导扇区

具体分析如下。

(1)0x00~0x02:3个字节,跳转指令。

(2)0x03~0x0A:8个字节,文件系统标志和版本号,呵以看到版本号为WIN4.1。 (3)0x0B~0x0C:2个字节,每扇区字节数,512(0x0200)。 (4)0x0D~0x0D:1个字钳,每簇扇区数,16(0xl0)。

(5)0x0E~0x0F:2个宁节,保留扇区数,32(0x0020),即FAT1起始于文件系统32扇区处。

(6)0x10~0x10:1个字节,FAT表个数,通常为2。 (7)1x11~0x12:2个字节,FAT32不使用此处,置0。 (8)0x13~0x14:2个字节,FAT32不使用此处,置0。

(9)0x15~0x15:1个字节,介质描述符,:0 xF8表示为本地硬盘。 (10)0x16~0x17:2个字节,FAT32不使用此处,置0。 (11)0x18~0x19:2个字节,每磁道扇区数,63(0x003F)。 (12)0x1A~0x1B:2个字节,磁头数,255。

(13)0x1C~0x1F:4个字符,分区前已用扇区数。该数值因分区及建立该文件系统的程序不同而有所差异,通常Windows会将主分区的此值设置为文件系统起始扇区相对于MBR位置的扇区数,将扩展分区内的逻辑分区的此值设置为文件系统起始位置相对于EBR位置的扇区数。

注意:某些程序会将所有文件系统此处的值全部设置为相对于MBR位置的扇区数。 (14)0x20~0x23:文件系统大小扇区数,30716208(0x0ID48130)。 (15)0x24~0x27:每个FAT表的大小扇区数,14984(0x3A88)。 (16)0x28~0x29:标记。 (17)0x2A~0x2B:版本号。

(18)0x2C~0x2F:根目录的簇号,通常为2。虽然在FAT32文件系统下,根目录和其他目录及文件一样可以存放在数据区的任何位置,但通常情况下仍然起始于数据区的第一个簇,即2号簇。

(19)0x30~0x31:2个字节,FSINFO扇区号。此处值通常为1,该扇区为操作系统提供关于空闲簇总数及下一个可用簇的信息。

(20)0x32~0x33:2个字节,备份引导扇区的位置。备份引导扇区总是位于文件系统的6号扇区。

(21)0x34~0x3F:12个字节,未使用。

(22)0x40~0x40:1个字节,BIOS INT 13H设备号,0x80。 提示:有时在某些软件中看到将第一个本地磁盘标为128,其实就是0x80的十进制表现形式。 (23)0x41~0x41:1个字节,未使用。 (24)0x42~0x42:扩展引导标志。如果此处值为0x29,说明它后面的三个参数值是有效的。

(25)0x43~0x46:卷序列号。通常情况下为一个随机值,但某些版本的Windows会根据文件系统建立日期和时间计算该值。

(26)0x47~0x51:11个字节,卷标(ASCII码)。如果建立文件系统时用户指定了卷标名,则保存在此处。

(27)0x52~0x59:8个字节,文件系统格式的ASCII码。明文则形如“FAT32”,但有

时并不完全准确。

(28)0x5A~0x1FD:410个字节,未使用。该部分区域没有明确指定用途,但通常是用于存放引导代码和错误信息。

(29)0x1FE~0x1FF:签名标志“55AA”。 提示:Winhex中提供了FAT32引导扇区模板,模板名为“Boot Sector FAT32”。图3.10是Winhex模板中显示的参数。

FAT32文件系统的FAT项只使用了32bit申的28bit,因此只能描述268435456个簇(实际上还要略小于这个值,因为这其中还包括用做结束标志及坏簇标志的保留值)。

操作系统通过检测FAT表中的表项来确定文件系统中的各个簇是否被分配使用。当我们在Windows下右击某个FAT分区查看其属性时,显示的已用空间和未用空间就是根据FAT 表统计而来。

提示:我们有时会遇到这种情况,就是查看属性时发现已用空间并没有减少,但存储的文件却不见了。这是因为某些病毒在文件或子目录的目录项中写入删除标记,但并没有清除FAT表内的簇链所至。

图3.14 跳转到FAT项

3.6 FAT32

的数据区

数据区是真正用于存储用户数据的区域。数据区紧跟在FAT2之后,被划分成一个个的簇。所有的簇从2开始依次编号。也就是说,2号簇的起始位置就是数据区的起始位置。

3.6.1 根目录

虽然原则上FAT32允许根目录位于数据区中的任何位置,但通常情况下它都是位于2号簇。也就是说,根目录大多数据区的起始处,只有为数很少的情况会位于2号簇以外的其他位置。

1.定位根目录

住FAT文件系统中,寻找第一簇(即2号簇)的位置也就是寻找数据区的开始位置,这并不是一件很容易的事,因为它并不是位于文件系统的开始处,而是位于数据区。在数据区前面是保留区域和FAT区域,这两个区域都不使用FAT表进行管理。因此,数据区以前的区域只能使用扇区地址(逻辑卷地址),而无法使用簇地址。所以说,并不是每个逻辑卷地址都相应地有·个逻辑文件系统地址,FAT文件系统就是—个很好的实例。

提示:NTFS文件系统与FAT文件系统不同,NTFS文件系统的第一簇总是起始于文件系统的第一个扇区。

要想定位一个FAT32文件系统的数据区的起始处,可以通过引导扇区中的相关参数计算得到。我们可以通过以下几个步骤进行查找和计算。

步骤1:从引导扇区的偏移0x0E-0x0F字节处得到保留扇区。 步骤2:从偏移0xl0字节处得到FAT表的个数。

步骤3:从偏移0x24-0x27字节处得到每个FAT表的大小扇区数。 步骤4:利用如下公式进行计算——

保留扇区数+每个FAT表大小扇区数×FAT表个数=数据区起始扇区号

通过以上几个步骤,我们就得到了数据区的起始位置,也就是2号簇的起始扇区号。要 想计算其他已知簇号的扇区位置,还需要由引导扇区的偏移0x0D。字节处找到每簇大小扇 区数,并使用以下公式计算——

某簇的起始扇区号=保留扇区数+每个FAT表大小扇区数×FAT表个数+(该簇簇号-2×每簇扇区数)

例如,假设一个FAT32文件系统的保留扇区数为32,有两个FAT表,每个FAT表的大 小为14984个扇区,每簇扇区数为16,则它的根目录的起始位置2 号簇,也就是数据区的起始位置位位于32+14984×2=30000 号扇区,3号簇则起始于30016 号扇区,占用30016-30032号,共16个扇区。

2.根目录分析

根目录在文件系统建立时即已被创建,其目的就是存储子目录(也称为文件夹)或文件的目录项。每个目录项的大小为32个字节。

文件系统刚刚创建,还没有存储任何数据时,根目录下没有任何内容,文件系统只是为 根目录分配了一个簇的空间(通常为2号簇),将结束标记写入该簇对应的FAT表项,表示该簇已经被分配使用。这时候,为根目录分配的空间内没有任何内容。但如果在创建文件系统时指定了卷标,则会在根目录下为其建立一个卷标目录项,该目录项占用根目录中的第一个目录项位置。

图3.15显示了一个刚刚创建的FAT32文件系统的根目录,该文件系统的卷标为“FAT32TEST”。

图3.15 新创建的FAT32分区的根目录 在根目录下新建目录或文件时,其实就是在为根目录分配的簇中为其建立目录项,如果 需要则在未分配空间中为其分配空间以存储数据内容。

不管是根目录下的目录项,还是子目录中的目录项,都具有以下基本特性:

● 为文件或子目录分配的第一个簇的簇号记录在它的目录项中,其他后续簇则由FAT 表中的FAT表链进行跟踪。

● 目录项中除记录了目录或文件的起始簇号外,还记录它的名字、大小(子目录没有大小1)、时问值等信息。

● 每个子目录或文件具有一个短文件名目录项外,还会有长文件名目录项。

● 短文件名目录项固定占用32个字节,长文件名目录项则根据需要占用1个或若干个 32字节。

● 对于同一个子目录或文件,它的长文件名目录项放存它的短文件名目录项之前,如 果长文件名目录项占用多个32字'节,则按倒序存放于短文件名目录项之前。 提示:长文件名目录的结构与短文件名目录项结构不同,详细结构我们将会在目录项部分进行介绍。

在此只是简要地介绍一下目录项的基本特性,在后面介绍目录项时会进行详细的介绍。

下面我们在根目录下新建一个子目录“子目录1”和一个文本文件“文件l.txt”,再来 看根目录的内容,如图3.16所示。

图3.16 文件和目录的目录项

由3.16可以看到,在根目录下已经为子目录“子目录1”和文件“文件l.txt”建立了目录项:

● 上面的方框中是“子目录1”的目录项,加底纹的部分为短文件名目录项,位于其上的是它的长文件名目录项。

● 下面方框中是“文件1.txt”的目录项。同样,加底纹的部分为它的短文件名目录项,位于其上的是它的长文件名目录项。

文件系统创建时只为根目录分配2号簇,也就是说只占用一个簇的大小。如果使用过程 中直接在根目录下建立了较多的子目录或文件,这些子目录和文件的目录项占据的空间已经 超出了一个簇,则会在未使用的空间中再为根目录追加分配一个簇,同时将2 号 FAT表项中的结束标记改写为指向新追加分配给根目录的簇的簇号,并在该簇号对应的FAT表项中写入结束标记。

3.6.2 子目录

我们将所有除根目录以外的目录都称为子目录,不管是根目录的子目录,还是根目录的 子目录的子目录。

在FAT32文件系统中,除根目录在在创建文件系统时即被建立并分配空间外,其他所有的子目录都是在使用过程中根据需要建立的。新建一个子目录时,在其父目录中为其建立目录项,在空闲空间中为其分配一个簇并对该簇进行清零操作,同时将这个簇号记录在它的目录项中。

提示:子目录的目录项中并不描述子目录的大小,要想知道子目录所占用的空间大小,

可以从它的目录项中获得它的起始簇号并跟踪它的FAT表链直到遇到结束标记为止。

如果在根目录下创建个子目录,我们就称这个子目录为根目录的子目录,称根目录为 该子目录的父目录。如前面我们在根目录下创建的“子目录1”即为根目录的子目录,而根 目录则是\子目录1”的父目录。同样,如果我们在“子目录1”下再创建一个子目录,那么 “子目录1”和这个子目录即为父子目录父系。 创建子目录时,在为其父目录分配的簇中建立目录项,目录项中描述子这个子目录的起 始簇号。在为子目录建立目录项的同时,也在为子目录分配的簇中,使用前两个目录项描述 它与父目录的关系。

我们以在讲述根目录部分时在根目录下创建的“子目录1”为例,看一看为其分配的簇 中记录子哪些内容,如图3 .17所示。

图3 17子目录的前两个目录项 我们可以看到,虽然该子目录下并没有再建立任何下级下目录和文件,但却在其占用的 簇空间中建立了两个目录项,第一个是“.”目录项,它描述该子目录本身的一些信息;第二个是“.”目录项,它描述的是该子目录的父目录的相关信息。通过这种方式,就在子同录和其父目录间建立起了联系。

在子目录中建立下一级下目录或文件时,为下级子目录或文件建立的目录项将从第三个 目录项开始写入。

提示:子目录和根目录的不同之处只在于根目录是在创建文件系统时建立的,如果>殳有卷标和内容,分配给根目录的簇空间内没有任何内容。 而子目录是在在储过程中根据需要由用户建立的,随着子目录建立的同时,会在为其分配的簇空间开始处建立两个目录项来描述子目录本身和其父目录的信息,以使父子目录间建立起联系。

3.6.3 目录项

在下AT32文件系统中,根据结构不同可以将目录项大致分为四种:卷标目录项、“.”目录项和“..”目录项、短文件名目录项、长文件名目录项。短文件名目录项是最重要的数据结构,其中在放着有关子目录或文件的短文件名、属性、起始簇号、时间值以及内容人小等信息。因此,我们将首先以短文件名目录项为对象介绍目录项的特性及结构,然后再介绍其他的目录项。

由于FAT文件系统将子目录看做是一种特殊的文件,所以它的目录项结构与文件目录项的结构总体上是一样的,只是属性值及文件大小的描述上有所差别(子目录不设置大小值)。因此,我们将子目录项和文件目录放在一起进行介绍。

提示:为了叙述方便,有时我们会用“文件“对子目录和文件进行统一称呼

1.短文件名目录项

短文件名目录项是FAT文件系统中非常重要的一种数据结构。之所以称其为短文件名

目录项,是因为它所记录的文件名延续子DOS时代的8.3格式,即8个字符的名字加上3个字符的扩展名:

如果文件名部分不足8个字符,用Ox20进行填充。

超过8个字符时则会被截短,因为短文件名目录项中没有足够的空间记录超出的部 分。截短的方法是取文件名的前6个字符加上了“~1”(如果有同名文件,则会依次递 增该数值),然后再加上其扩展名。

如果是子目录,则将扩展名部分用“Ox20”进行填充。

为子解决长文件名问题,FAT文件系统又增加子一种“长文件名”目录项结构。其实从 Windows 95开始,不管文件名的长度是否超过8个字符,都会同时为其创建短文件名目录项和长文件名目录项,因为短文件名不区分大小写,而长文件名则是区分大小写的。

提示:我们将在后面的部分对长文件名及其目录项进行介绍。为子叙述方便,我们将在本部分中将短文件名目录项直接称为目录项。

2.短文件名目录项的特性

每个文件或子目录部分配有-个大小为32个字节的目录项,用以描述文件或子目录的属 性、大小、起始簇号和时间日期等信息。除此以外,文件名或子目录名也记录在目录项中。 目录项还具有以下特性:

当新建一个文件或子目录时,在其父目录中为其建立目录项。因为每个目录项的大 小固定为32个字节,所以我们可以把包括根目录和子目录在内的所有目录的内容部 分看作是一个目录项的列表。所有的目录项并不是具有相同的地址,而要找到一个 目录项的位置只能用分配给文件或子目录的全名进行搜索。

目录项结构中有一个属性区域,每个文件可以设置7种属性。操作系统或者某些工 具软件可能会忽略其中的某些属性。但某些属性决定着目录项被访问的方式,所以 是不可忽略的。这些天键属性包括——

◆ “子目录”属性。用来说明该目录项是一个子目录的目录项,子目录目录项所 指向的簇空间用以存储下级子目录的目录项或文件目录项。

◆ “长文件名”属性,长文件名属性是长文件名}j录项所具有的属性,它是一种 特殊类型的目录项,我们将在“文件名”部分进行详细的介绍。

◆ 还有一个是“卷标”属性,卷标目录项具有卷标属性,卷杯目录项只占用根目 录的第一个目录项位置。

每个文件或子目录还有4个非关键性属性,这些属性是否起作I用取决于操作系统是 不是强制执行它们——

◆ 只读属性。只读属性用于限定文件只可读取而不可写入。但是Windows 98和 Windows XP 下,在具有只读属性的文件夹中可以新建文件。

◆ 隐藏属性。文件或目录被设置“隐藏”属性后,将不会显示在其所在文件夹的 内容列表内。但文件或目录的“隐藏”属性通常是通过操作系统进行设置,所 以也可以通过操作系统的某些设置对其进行查看。

◆ 系统属性。系统属性用来说明一个文件是系统文件。

◆ 存档属性。当新建一个文件或对文件内容进行写入后,Windows还会为该文件 设置一个存档属性。

每个目录项包含三个时间值,即建立时间、最后访问时间和最后修改时间—— ◆ 建立时间,精确到十分之一秒。

◆ 最后访问时间,精确到日。

◆最后修改时间,精确到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进行填充。

(3)0x0B-0x0B:1个字节,长目录项的属性标志,一定是0x0F。 (4) 0x0C-0x0C:保留。

(5) 0x0D-0x0D:1个字节,校验和。如果一个文件的长文件名需要几个长文件名目录项进行存储,则这些长文件名目录项具有相同的校验和。

(6)0x0E-0x19:12个字节,文件名的第6-11个宁符,未使用的字节用0xFF填充。 (7) 0xlA-0xlB:2个字节,保留。

(8) 0xlC-0xlF:4个字节,文件名的第12-13个字符,未使用的字节用0xFF填充。 8.长文件名目录项实例分析

我们建立一个名字为“abcdefghij klmnopqrstuvwxyz1234567890.txt”的文件,来看一F 它的长文件名目录项,如图所示。

长文件名目录项

我们看图中大方框圈定的部分,它由“abcdefghij klmnopqrstuvwxyz1234567890.txt”文 件的短文件名目录项和长文件名目录项组成。最下面的一个目录项是它的短文件名目录项。 由短文件名向上,是它的长文件名目录项。“abcdefghij klmnopqrstuvwxyz1234567890.txt”共有40个字符,每个长文件名目录项可以记录13个字符,因此需要4个长文件名目录项。短文件名目录项向上第一个小方框圈定的目录项是它的第一个长文件名目录项,向上依次为2、3、4号,从每个长文件名目录项的第一个字节可以看出它们的序号。 (1)我们首先看第一个的内容:

> 0x0B字节处的“OF”表示这是一个长文件名目录项。

> 0x00字节的“01”表示这是该文件的第一个长文件名目录项。

> 0x0l-0x0A字节处的10个字节为文件名的第1-5个字符“abcde”,0x0E-0x19字节处 的12个字节是文件名的第6-11个字符“fghijk”.0xlC-0xlF处的4个字节是文件名的第12-13个宁符“Im”。

(2)第二、三个长文件名目录项的第一个字节“02”、“03”表示这是该文件的第二、三 个长文件名目录项,各部分字节的含义读者可以自行分析。 (3)第四个长文件名目录项的第一个字节为“44”,是0x40和0x04进行或运算的结果, 说明这是该文件的第4个长文件名目录项,也是最后一个。它的偏移0x01~0x02处的两个字节为长文件名的最后一个字符“t”,后面未使用的文件名部分先填充了两个字节的“00”,然后开始用0xFF进行填充。 *注意:我们分别看四个长文件名目录项的0x0D字节处的值,这是长文件名目录项的校验和,四个长文件名目录项此处的值均为0x27,说明这四个目录项是同一个文件的长文件名目录项。 9.“.”目录项和“..”目录项 前面曾经介绍过,一个子目录的起始簇,前两个目录项为“.”目录项和“..”目录项,子目录通过这两个目录项及它在父目录中的目录项建立起父子目录间的联系。从结构上来讲,这两个目录项与普通的短文件名目录项没有任何区别,所不同的只是它们描述的对象不同。

> “.”目录项位于子目录起始簇的第一个目录项位置,它用以表明该簇是一个子目录

的起始簇。另外,该目录项实际上是对该子目录自身的描述,它记录了该子目录的时间 信息、起始簇号等。需要强调的是,它所记录的起始簇号也就是该子目录目前所处的位 置。

> “..”目录项位于子目录起始簇的第二个目录项位置,用于描述该子目录的父目录 的相关信息。

以前面我们在根目录下建立的“子目录1”为例,系统为它分配的簇空间为5号簇,图中即为5号簇的内容。

“.”目录项和“..”目录项 我们重点看两个目录项的簇号描述部分(加底纹部分):

> 第一个目录项也就是“.”目录项,记录的簇号为3号簇,也正是本子目录所在的 簇。

> 第二个目录项记录的簇号为这个子目录的父目录的起始簇号,如果父目录是根目 录,则簇号位置全部设置为0。

目录项中也记录着该子目录建立时问和最后修改时间等信息,但Windows似乎建立它 们后使不再对其进行更新。也就是说它们的最后修改时间和建立时间一直保持着建立时 的时间值。这个特点可以用于验证一个目录的建立时间,因为它的建立时间值应该同“.” 和“..”的时间值是一样的。如果一个目录的目录项中所反映的建立时间与“.”和“..” 目录项的时间不同,则用户很可能对其做过隐藏行为或者某个应用程序对其进行了改 变。 *注意:我们无法通过“.”和“..”目录项对目录的最后修改时间进行验证,因为对任何相关 目录的改动都不更新这两个目录项。 10. 卷标目录项

如果创建文件系统时指定了卷标,则会在根目录下的第一个目录项位置建立一个卷目录项

> 卷标名最多允许占用长度为11个字节,也就是为短文件名分配的11个文件名区 域。如果卷标名不足11个字节,则用0x20填充。 *注意:由于每个汉字占用两个字节的空间,而卷标最多只允许占用11个字节,所以用汉字 命名卷标时,卷标名的长度不能超过5个汉字。

> 卷标目录项的结构与普通短文件名目录项结构完全相同,但没有创建时间和访问时 间,只有一个最后修改时间。

> 另外,卷标目录项也没有起始簇和大小值,这些字节位置全部设置为0。0x0B字节

处的属性值为0x08。 *提示:读者可以对照图3.15分析卷标目录项

11. 目录项中时间值的更新

目录项中有三个时间值:最后访问日期、最后写入时问和建立时间。

(1)建立时间。当Windows为一个“新”文件分配新目录项时设置建触时间。“新文件” 的范围比较重要,因为:

> 操作系统为一个已经存在的文件(刚使这个文件原来是位于另外的磁盘上)分配目 录项时,将会沿用它原来的建立时间。例如,对一个文件进行重命名或将其移动到另 外的目录或磁盘时,原有的建立时间将会写入到新建的目录项中。 *注意:目前已知的一种例外情况是,当使用Windows 2000/XP系统的命令行将一个文件移动到不同的卷时,会将建立时间设置为移动时的时间值。 > 拷贝文件时。将会建立一个新的文件,并将建立时间设置为建立时的时间值。 (2) 最后写入时间。当Windows向文件中写入新的内容时,最后写入时间会被更新: > 这个时间值的更新基于文件内容而不基于目录项,住拷贝文件时此值不会被更新。 > 在Windows下移动或拷贝文件时,新目录项将会保持原文件的最后写入时间。 > 改变文件的名字或属性不会导致此值被更新。

> 当一个应用程序向文件中写入内容时,即使应用程序只是做了一个自动保存的操作 而并未改变文件的内容,Windows也会对最后写入时间进行更新。

也就是说,在Windows下移动文件时,目的文件将会沿用原文件的建立时间和最后写 入时间,除非是使用命令行将文件移动到了另外的卷中。

拷贝文件时,目的文件沿用原文件的最后写入时间,但拥有新的建立时间。这很容易使 人产生迷惑,因为文件的建立时间比最后写入时间还要晚。存Windows下使用应用程序新建文件时,文件的最后写入时间会设置为比建立时间稍微晚一些。 (3)最后访问日期。这个时间值只精确到日期,会经常地被更新: > 每次打丌文件都会导致该文件的最后访问日期被更新。

> 即使只是使用右键查看一个文件的属性,新文件的访问日期也会被更新。

> 将一个文件移动到另外的卷时,新文件的最后访问日期会被更新,因为在写入新卷 时,Windows需要读取原文件的内容。

> 如果是在同一个卷内移动文件,访问日期不会改变,因为在这个过程中并不需要读

取文件的内容,文件内容的存储位置也没有发生改变,只是新建一个目录项而已。 *注意:有一个特殊情况,在Windows XP下拷贝文件或使用“复制”菜单功能时,文件的最 后访问日期币会被改变。而Windows 98则在目的文件建立后即更新源文件的最后访问日期。 Windows的某些版本可以设置为不更新最后访问日期。 *提示:对于目录,当它被建立后就不怎么对时间值进行更新,即使是为其分配新的簇或者在其下新建文件时,它的最后写入时间也不被更新。

本文来源:https://www.bwwdw.com/article/s3k6.html

Top