09年的时候,虽然接触了FAT文件系统,但是FAT还很简单。 我今天正好看到了写在之前下载的gdfgd0218@126.com上的“FAT32文件系统详细信息”一章。 顺便花了一点时间整理。
我以前对FAT的了解还很深,现在摘录几个要点,半原创半转载吧。
FAT应该只会写这个博客,干脆放入NTFS吧。
FAT重要数据结构:FAT表,目录项目
FAT表包含有关多个文件的元数据,包括群集通道关系、目录条目记录中的文件名和大小的起始地址。
FAT12、FAT16的根目录也属于数据区域,但不是由集群管理的。
也就是说,FAT12、FAT16的根目录中没有集群号,他们的第二个集群在根目录之后开始。 FAT32的根目录通常位于2号群集上。
FAT区域的大小可以通过将每个FAT表的大小扇区数乘以FAT表的个数而得到的扇区数和FAT区域的大小,从而知道数据区的开始位置,并得到文件系统的第一个集群的位置。
FAT表
编号为0的FAT表项和编号为1的FAT表项由系统维护,并存储特殊标志的内容。 2号以后,各地址对应于数据区的集群号,FAT表的地址号与数据区的集群号相同。
数据区域紧接在FAT2之后,被分成一个个的集群。 所有群集都从2开始编号。 也就是说,集群号2的开始位置是数据区域的开始位置。
原则上,FAT32允许根目录位于数据的任何位置,但通常位于群集号2。
某个集群开头扇区号=保留扇区数FAT表大小的扇区数 FAT表数该集群号- 2)每个集群的扇区数
目录项目
根目录或子目录下的目录条目具有以下基本特性:
1 .分配给文件或子目录的第一个集群的集群号记录在该目录条目中,其他后续集群由FAT表的FAT表链跟踪。
2 .在目录条目中,除了子目录或文件开头集群号之外,还记录名称、大小子目录中没有大小)、时间值等信息。
3 .每个子目录或文件除了具有短文件目录条目之外,还具有长文件名目录条目。
4 .短文件名目录项固定占用32字节,长文件名目录项根据需要占用一个或多个32字节。
5 .对于相同的子目录或文件,长文件名目录条目存储在短文件名目录条目之前。 如果长文件名目录条目占用32个或更多字节,它将按相反的顺序存储在段文件名目录条目之前。
子目录
创建子目录后,将在分配的群集区域的开头创建两个目录条目.和.描述子目录本身及其父目录的信息,并建立上下目录之间的联系。
1 .目录条目位于子目录的起始群集的第一个目录条目中,表示该群集是子目录的起始群集。
另外,该目录条目实际上是目录自身的描述,记录有该子目录的时间信息、开头集群号码等。 需要
请注意,记录的开始群集编号是子目录当前所在的位置。
2 .目录条目位于子目录起始群集的第二个目录条目的位置,用于描述有关子目录父目录的信息
1 .短文件名目录条目
短文件名目录条目是FAT文件系统中非常重要的数据结构。 之所以将其称为短文件名目录条目,是因为记录的文件名继续了DOS时代的8.3格式。
即,8个字符的名称和3个字符的扩展名:
a .文件名小于8个字符时,用0x20填充。
b .超过8个字符将被截断。 因为短文件名目录条目没有足够的空间来记录超出的部分。
截断方法是在文件名的前6个字符中加上“~1”,并将其扩展名。 如果有同名的文件,请依次增加其值。
c .对于子目录,用“0x20”填充扩展名部分。
为了解决长文件名问题,在FAT文件系统中添加了“长文件名”目录条目结构。 从windows95开始,不管文件名的长度是否超过8个字符,
短文件名不区分大小写,长文件名区分大小写,因此会创建短文件名目录条目和长文件名目录条目。
2 .短文件名目录条目的特性
每个文件或子目录都有一个32字节的目录条目,用于描述文件或目录的属性。
目录条目是否被分配为由第一个字节描述。 分配的目录条目的第一个字节是文件名的第一个字符。
删除文件或目录时,相应目录条目的第一个字节设置为0xE5。
3 .长文件名的目录条目
FAT32文件系统为文件分配短文件名目录项,同时分配长文件名目录项。
创建文件的长文件名LFN )类型的目录条目时,文件系统没有放弃原始短文件名的目录条目。
具有LFN的文件还具有普通短文件名sfn )类型的目录条目。
之所以仍需要SFN,是因为LFN目录条目只包含文件的名称,而不包含时间、大小、起始群集号等信息。 这些信息仍然需要在SFN目录条目中记录。
4 .长文件名目录项的特性
如果文件名超过8个字符,则会截断名称并创建短文件名。 将短文件名保存为短文件名
目录项中。
长文件名则存放在长文件名目录项中。长文件名目录项有以下的特性:
a.LFN 和 SFN 目录项结构在相同位置有一个属性标志字节,LFN 目录项使用一个特定的属性值,以说明它是一个长文件名项。
b.项中的其他字节,使用 UTF-16 编码(UTF-16 是 Unicode 的其中一个使用方式。 UTF 是
Unicode/UCS Transformation Format,即把 Unicode 转做某种格式的意思),存储 13 个 Unicode字符的文件名,每个字符占用两个字节。
c.如果文件名长于 13 个字符,则继续为其分配 LFN 项,直到够用为止。
d.所有 LFN 都包含一个校验和,通过这个校验和将其与相应的 SFN 项关联起来。
e.一个文件的所有 LFN 项按倒序排列在它的 SFN 项前面,即文件名的第一部分距离 SFN 是最近的。