主要流程
(比较简单地写一写,会省略掉很多细节,比如数据区的簇是从2号开始的之类的)
- 从引导扇区中获取BPB数据结构,由此计算出FAT表、根目录区以及数据区的起始位置
- 在根目录区中找到要遍历或寻找文件的对应文件 / 文件夹
- 根据在根目录区找到的entry中的FstClus项(即详细信息在数据区中的第一个簇的位置)去数据区找详细信息
3.1 如果是个文件,数据区从第一个簇(FstClus)开始保存的是文件的内容
3.2 如果是个文件夹,数据区从第一个簇(FstClus)开始保存的是文件夹下的内容(仍旧是RootEntry的形式)。一个数据区簇能保存的entry最大数目是确定的,根据这个数目来进行遍历 - 读取文件内容时,若文件内容超过512字节(一个扇区的大小,本系统中一个簇就是一个扇区),需要用到FAT表
4.1 根据根目录区只能知道文件内容存放的第一个簇的位置,如果文件内容超出第一个簇,则需要去FAT表中寻找之后的簇
4.2 FAT表可以看作是一个链表的形式,每个FAT item与数据区簇的位置一一对应,存放的内容是这个簇的下一个簇的簇号,如果簇号大于或等于0xFF8,说明这是这个文件的最后一个簇
遇到的问题
其实流程清楚了问题就不是很大,不过为了满足作业的输出要求还是写了很多垃圾代码,除了增加开销之外没有其它任何用处
在写到文件内容读取的时候遇到一个“玄学”问题,以当前cluster < 0xFF8
为while循环的条件来输出文件内容,可是当cluster == 0xFFF
的时候还依旧会进入这个循环,奇怪了很久,后来把这个0xFFF
用十进制输出,发现它居然是-1,这才明白过来是符号的问题,于是把这个方法里用到的所有cluster都改成了无符号整数,就没有这个问题了