操作系统作业——C语言实现FAT12文件系统

主要流程

(比较简单地写一写,会省略掉很多细节,比如数据区的簇是从2号开始的之类的)

  1. 从引导扇区中获取BPB数据结构,由此计算出FAT表、根目录区以及数据区的起始位置
  2. 在根目录区中找到要遍历或寻找文件的对应文件 / 文件夹
  3. 根据在根目录区找到的entry中的FstClus项(即详细信息在数据区中的第一个簇的位置)去数据区找详细信息
    3.1 如果是个文件,数据区从第一个簇(FstClus)开始保存的是文件的内容
    3.2 如果是个文件夹,数据区从第一个簇(FstClus)开始保存的是文件夹下的内容(仍旧是RootEntry的形式)。一个数据区簇能保存的entry最大数目是确定的,根据这个数目来进行遍历
  4. 读取文件内容时,若文件内容超过512字节(一个扇区的大小,本系统中一个簇就是一个扇区),需要用到FAT表
    4.1 根据根目录区只能知道文件内容存放的第一个簇的位置,如果文件内容超出第一个簇,则需要去FAT表中寻找之后的簇
    4.2 FAT表可以看作是一个链表的形式,每个FAT item与数据区簇的位置一一对应,存放的内容是这个簇的下一个簇的簇号,如果簇号大于或等于0xFF8,说明这是这个文件的最后一个簇

遇到的问题

其实流程清楚了问题就不是很大,不过为了满足作业的输出要求还是写了很多垃圾代码,除了增加开销之外没有其它任何用处
在写到文件内容读取的时候遇到一个“玄学”问题,以当前cluster < 0xFF8为while循环的条件来输出文件内容,可是当cluster == 0xFFF的时候还依旧会进入这个循环,奇怪了很久,后来把这个0xFFF用十进制输出,发现它居然是-1,这才明白过来是符号的问题,于是把这个方法里用到的所有cluster都改成了无符号整数,就没有这个问题了

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值