首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

SD卡FAT16文件系统的学习笔记(3)

SD卡FAT16文件系统的学习笔记(3)

七、 FDTFAT表的简单介绍
读取文件之前要先详细了解一下FDT,和FAT表的内容

一个FDT表占32个扇区,共有512个文件登记信息,所以每个文件登记信息的大小为32*512/512=32Byte
每个文件登记信息如下图所示

对于我们来说,这个文件记录信息最重要的就是最后六个字节
最后四个字节代表文件大小,由文件大小可以推算出该文件占用多少个数据簇
第0x1a到0x1b个字节道标文件开始的首簇号,知道文件的首簇号我们就可以查看FAT表的相应信息,就可得到该文件所占用的所有数据簇的簇号。

以下是FAT表的结构


上表中,06、07单元映射了磁盘3号簇区。有之前的介绍中可以知道,我这张SD卡1个簇包含4个扇区。也就是说在写数据时,只有写完了3号簇的4个扇后,将FAT表的06,07单元填写04,00;才可继续在04号簇上写数据。如果数据写完后还没有写满3号簇,则在FAT表的06,07单元填写FF,FF.
也就是说在FAT表中记录着每个数据簇的状态,且每个数据簇的状态占用两个字节。如果这两个字节等于0xffff,则代表该数据簇以被占用,且文件在该数据簇中结束。如果这两个字节等于0x0001~0xfffe,则代表该数据簇已被占用,且该文件没有结束,而该文件存放的下一数据簇的簇号就等于这两个字节的大小。

八、读取一个文件
下面以我的SD卡为例子,向大家介绍读写SD的FAT文件系统的文件(最好先安装一个叫做winhex的软件)。

首先我的SD卡存放着这样一个文件


要打开我这个名为lqz.txt的文件的,我们先查找FDT表中关于lqz.txt这个文件的登记信息。
因为之前已经知道了FDT的首地址是第585扇区,我们来到585扇区,开始搜索LQZ.TXT(必须先转换成大写字母)

最后在地址为0x4a310(也就是第0x4a310/512=593扇区)的地方搜索到LQZ.TXT的文件登记信息,在最后四个字节得知该文件大小为0x00002c89=11401Byte,占用11401/512/4=6个数据簇,从倒数第5,6个字节可以知道文件的首簇号为0x2fe4,然后在FAT表根据文件的首簇号查找接下来文件占用的五个数据簇簇号,数据簇0x2fe4在FAT的登记位置=FAT地址+0xfe4*2=0xca00+0x2fe4*2=0x129c8,我们来到0x129c8这个地址

数据簇0x2fe4的信息就存放在0x129c8,和0x129c9这个字节里,从上图可以看出这两个字节等于0x46F4,也就是说LQZ.TXT存放的下一个数据簇的簇号为0x46F4,由于该文件占用6个数据簇,所以我们必须继续查找剩下的4个数据簇的簇号。我们继续查找簇号为0x46f4的数据簇在FAT表的信息,地址为0xca00+0x46f4*2=0x157e8

由上图可以下一数据簇的簇号为0x46f5。然后按照上诉方法查找剩余三个簇号分别为0x46f6,0x46f7,0x46f8,最后在0x46f8对应的地方存放着0xffff,代表文件到此结束。
经过上诉步骤我们知道我lqz.txt文件依次存放在0x2fe4,0x46f4,0x46f5,0x46f6,0x46f7,0x46f8这6个数据簇,接下来我们就读取这6个数据簇的内容即可。
比如说:数据簇0x2fe4的地址=数据簇0地址+0x2fe4*4*512=0x4c200+0x2fe4*4*512=0x183e200,0x183e200/512=49649,也就是在物理扇区49649~49652这个四个扇区都是数据簇0x2fe4的内容
继承事业,薪火相传
返回列表