FAT文件系统主要有三种格式:FAT12,FAT16,FAT32
FAT12没有看到过,不太清楚
FAT16则是一种微软早期的系统的一种文件系统,能管理的硬盘大小不超过2G
FAT32则是现在在电脑上的主流的一种文件系统,能管理的硬盘大小为2T
虽然在电脑上主流为FAT32,但在一些偏携式器件里的存储系统所用的还是FAT16,所以研
究FAT16和FAT32都是很有必要的,以下为我这几天看的一些资料的总结。
FAT文件系统的一般性介绍参照http://hi.baidu.com/hao01222/blog/item/43142e811de75edbbd3e1ef8.html里介绍的就可以了。
这里主要是介绍引导扇区的各位定义。
由于FAT16和FAT32的引导扇区定义不同,所以我们这也分开来介绍:
FAT32:在FAT32引导扇区中主要有意义的也就00H—52H,下面我们就以程序的先后的顺序来记录:
PS:我们这里讲的地址均为逻辑磁盘地址,在单片机读出的也为逻辑磁盘地址(我不知道为什么?)。若转化为物理扇区,需加上32个扇区。从4000H开始读则为所需的引导扇区
PS:读数据时最重要的一点:必须从扇区的开始读起,不能从中间读,否则返回值不准(我的返回值均为0XFF)。
第一步:我们要确定是否为FAT32或FAT16:在FAT32中由52H,53H,54H,55H,56H来确定,若此五字节为FAT32,此则说明此卷为FAT32文件系统,若不是应查找36H,37H,38H,39H,3AH,3BH,若此五字节为FAT16,则说明此卷为FAT16文件系统。
(以下都先认定为FAT32格式,FAT16格式的下面再说)
第二步:我们要确定的是的每各扇区的字节数:由0BH,0CH来决定,共两字节,一般都是512BYTE
第三步:我们要确定的是每簇所占的扇区数:由0DH决定,一个字节(512M的为一簇占8扇区)。
第四步:查看隐藏扇区大小,此处关系FAT1,FAT2,根目录地址:1CH,1DH,1EH,1FH所决定,共四字节。
第五步:保留扇区,这对编程而言很重要,他关系到你的FAT1,FAT2,和根目录的地址:由0EH,0FH决定,共两个字节(FAT1的起始扇区为保留扇区+隐藏扇区)。
第六步:查看文件分配表的个数,一般都是两个,但关系到根目录的地址,还是查下比较好:由10H决定,一个字节。
第七步:查看此卷的大小,即分区所占扇区数:20H,21H,22H,23H所决定,共四字节:此四字节数再乘以每个扇区所占字节数,即为此卷的实际大小。
第八步:查看FAT的大小,即FAT1,FAT2所占扇区数,此处关系根目录的地址:24H,25H,26H,27H所决定,共四字节(根目录地址即为保留扇区数+隐藏扇区+FAT扇区数*2)
第九步:查看根目录所在簇(这一块我到现在也不知道有什么用),由2CH,2DH,2EH,2FH决定,共四字节。
SD文件系统基本实现(构想)
------只是实现了基本功能
SD文件系统根目录找寻(注意必须从扇区开始读取,否则读取值错误):
一,读取扇区大小--------512
二,读取隐藏扇区个数
三,读取保留扇区个数
四,读取FAT个数----------2
五,读取FAT大小
六,读取一簇包含的扇区个数-------8
七,计算根目录的地址
根目录地址=(隐藏扇区个数+保留扇区个数+FAT大小*FAT个数)*扇区大小
SD文件系统的显示
一,根目录读取(每32个字节读取):
1,第一字节为5E,省去这32字节
2,第一字节为00,结束根目录读取
3,其他数值,读取文件名
二,文件名读取(32个字节读取):
1,前八个字节为文件名
2,第8~10字节为文件类型
3,第11字节为文件属性-----判断其是否为0X10,若是则为文件夹
4,第14,15字节为文件创建时间
5,第20,21,26,27字节为文件所在簇号---(簇号—2)*一簇的扇区数+根目录所在的扇区==文件所在扇区
6,第28~31字节为文件的长度
三,判断11字节
1,是0X10,表明文件是一个文件夹
2,不是0X10,表明不是一个文件夹,只是普通的单个文件
四,子文件夹读取(每32个字节)
1,前32字节为当前文件夹的信息-----26,27,28,29字节为其簇号
2,32位~45字节为父文件夹的信息------相对应的同样四个位置为其簇号
3,从46字节开始读取子文件夹内的文件(如同根目录)
五,文件的读取(保留相对父文件夹的地址信息,以便返回)
1,从文件目录中读取文件所在的簇
2,根据簇来读取所在的扇区(计算方法上面有介绍)
3,通过扇区*512来得到其首地址
4,通过文件的大小(上面注明如何得到),来读取数据
六,文件的返回--------读取文件保存的父文件夹的地址信息从而进行文件的返回
七,文件夹的返回--------读取父文件夹地址信息(前面介绍过),判断其簇号是否为0
1,若为0,表明父文件夹为根目录。簇号+2返回(前两个簇为系统保留)。
2,若不为0,则表明父文件夹还是另一个文件夹的子文件夹,直接通过其簇号找到地址后返回(计算方法前面介绍过)。
以上即为我的SD文件系统读取的想法,感觉虽然想的简单,但若真正做下去就很烦琐,所以就没有做下去了,只是做了简单的根目录的读取,希望能对大家有所帮助。
其中根目录如何找寻,我在另一篇中已有介绍
http://hi.baidu.com/hao01222/blog/item/03ffd6ee8f16752a2df534dc.html
希望能得到高手指点我想法中的错误之处。