这个小结是做一个修改型的小项目,为了学习了解FAT16文件系统而写的,记录一下。
//*******************************************************************
void FAT_Info
{
读BPB扇区,得到FAT基本信息
计算保留扇区数;
计算每簇扇区数;
计算根目录的项目数;
计算根目录扇区数;
计算总扇区数;
计算每FAT分区表占用的扇区数
判断是否为FAT16
计算1,FAT首扇区
计算2,DPT首扇区
计算3,DAT首扇区
}
void ReadSector()
{
定义局部变量
开中断
if
**********第一次进入(即找同名文件)***********
读根目录首扇区内容
when(根目录扇区数还是大0)//扫描32次,因为根目录区有32个扇区,直到找到同名文件止
{
for(扫描当前根目录扇区中的16个目录项)
{
if(假如某目录项首字节为0) //则目录为空,直接退出,搜索下一目录项
{
开中断
返回(0)
}
if(假如查找到同名文件所在目录项)
{
计算该文件首簇位置
计算每簇扇区数
计算文件字节数(剩余字节数)
计算该文件首扇区位置
搜索下一簇号 //连续读取的重要一步
读出首扇区512字节内容
if(假如剩余字节数>512) //即文件长度大于一扇区(512字节)
{
剩余字节数=剩余字节数-512
每簇扇区数=每簇扇区数-1
开中断
返回(512)
}
else(则剩余字节数<512) //即文件长度不足一扇区(512字节)
{
剩余字节数=0
每簇扇区数=0
开中断
返回(512)
}
}
}
下一扇区(page++); //准备读取一个数据簇内的剩余扇区内容
根目录扇区数(cnt++); //控制扫描根目录扇区的,共32个扇区,直至找到同名文件
}
开中断
返回(0)
else
**********第N 次进入(即读取下一簇数据)*******
//在到这里之前已经搜索到文件了,不再搜索目录
//下面为继续读取文件数据第2扇区开始的内容,如果剩余字节>512的话
//第1扇区的内容在搜索完目录区时,已经被读取了
if(假如剩余字节>0)
{
if(每簇扇区数==0) //其实到这已经是读一簇中的最后一扇区内容了
{
取得下一簇号(搜索目录时所得或前次操作所得,作为本次操作簇号)
再取下一簇号(为下一次操作准备)
计算该簇号的首扇区的位置
计算簇内剩余扇区数
}
else(否则说明不是该簇最后一扇区内容,在这为该簇首扇区内容)//在这每簇2扇区
{
计算该扇区的位置
}
读出由上计算得出扇区位置的512字节内容
剩余字节数=剩余字节数-512
每簇扇区数=每簇扇区数-1
////////////////////
以下内容为容错设计吧,其实也不算是
////////////////////
if(剩余字节数<0)
{
每簇扇区数=0
剩余字节数=0
开中断
返回(512)
}
else
{
开中断
返回(512)
}
}
else
{
开中断
返回(0)
}
}
//******************************************************************
void SerchNext()
{
读FAT表;
根据首簇位置,读下一簇号;
返回簇号;
}
1,计算出簇号所在的FAT表扇区
2,将该扇区的内容读出(内容分区表簇链)
3,计算出簇号在该扇区的位置
4,读出该位置的内容,即为下一簇号
某簇号所在FAT表扇区=FAT表起始扇区+簇数*两字节表示一簇/每一扇区字节数=FAT+cluster*2/512
文章评论(0条评论)
登录后参与讨论