FAT32文件系统解析( 三 )


那么 FAT 表有多大呢?FAT 表中每四个字节表示一个簇,所以 FAT 表的大小由实际的簇数来决定 。从这里也可以看出,如果簇过大,则 FAT 表比较小,但会造成空间的浪费,而如果簇过小,可以减小空间的浪费,但会使FAT 表变得臃肿 。FAT 表的大小可以从 BPB 参数 BPB_FATSz32读出 。
现在知道了FAT表的地址和FAT表的大小,也知道有两个FAT表就可以计算出第一个文件夹也就是根文件夹的位置,他的位置就在FAT表的正后方,计算方法如下:
FirstDirSector = FirstFATSector + BPB_NumFATs[0] * FATsectors 其中FirstFATSector 表示FAT表的位置,BPB_NumFATs[0] 表示FAT表的数量,FATsectors 表示的是FAT表占用的扇区数量 。其实根目录所在的簇就是第2号簇 。计算出了根文件夹的位置就可以从根文件夹中读取数据 。在 FAT32 中其实已经把文件的概念进行扩展,目录同样也是文件,根目录的地位与其它目录是相同的,因此根目录也被看作是文件 。既然是文件就会有文件名,根目录的名称就是磁盘的卷标 。
下面所以说根目录文件的内容 。首先目录也是文件,它可以看做是特殊文件,这个文件使用来存放其他文件或目录的信息,例如文件名、扩展名、属性、创建时间、最后修改时间、文件起始簇号、文件长度等等 。所以我要读取一个文件信息的时候首先要做的就是从目录中读取文件的信息数据 。根据上面说的我们已经获取到了根目录的地址,那么就可以从根目录中读取根目录下的文件信息 。每个文件/目录在目录文件中使用32个字节的数据表示,具体字段如下所示:
这样就可以从根目录下读取各个文件,我们作为试验不设计嵌套目录的结构,只在根目录下进行文件查看、读写试验 。所以在我的512M的TF卡上根目录下有一个test.txt文件,根目录的数据如下所示:
Offset0123456789ABCDEF 0040000042 20 00 49 00 6E 00 6600 6F 00 0F 00 72 72 00B .I.n.f.o...rr.004000106D 00 61 00 74 00 69 006F 00 00 00 6E 00 00 00m.a.t.i.o...n...0040002001 53 00 79 00 73 00 7400 65 00 0F 00 72 6D 00.S.y.s.t.e...rm.0040003020 00 56 00 6F 00 6C 0075 00 00 00 6D 00 65 00.V.o.l.u...m.e.0040004053 59 53 54 45 4D 7E 3120 20 20 16 00 23 BB 58SYSTEM~1..#»X004000507E 49 7E 49 00 00 BC 587E 49 03 00 00 00 00 00~I~I..¼X~I......0040006054 45 53 54 20 20 20 2054 58 54 20 18 23 C0 58TESTTXT .#ÀX004000707E 49 81 49 00 00 5A 577E 49 05 00 13 20 00 00~I.I..ZW~I... ..0040008054 41 4E 47 51 55 41 4E20 20 20 08 00 00 00 00TANGQUAN.....0040009000 00 00 00 00 00 DA 587E 49 00 00 00 00 00 00......ÚX~I......004000A000 00 00 00 00 00 00 0000 00 00 00 00 00 00 00................我们可以看到在根目录下的0x60到0x7F处表示的就是根目录下的text.txt文件,0x80到0x9F处则表示的是根目录 。前面的两个文件信息表示的可能是一些隐藏的文件,具体我也没了解是什么 。反正至此已经可以从FAT32文件系统中成功获取根目录下的文件的信息,下一步就是根据这个文件的信息寻找文件存储的位置,读取文件内容 。
32个字节的文件信息已经给得很明确了,确定了文件的其实簇号之后就可以进入FAT表中寻找那个簇以及文件的簇链,根据文件长度字段可以知道文件占用多少个簇,其实根据簇的链式存储结果就可以知道文件占用的簇数目,但是并不知道文件在最后一个簇中占用了多少个字节,所以文件长度字段还是很有意义的 。找到对应的簇之后从对应的簇中读取数据即可,easy is'nt it?
原文地址:
https://blog.csdn.net/tq384998430/article/details/53414142

【FAT32文件系统解析】


推荐阅读