原创 [原创]FAT16文件系统实现关键流程

2009-3-1 15:07 3735 9 9 分类: MCU/ 嵌入式

这个小结是做一个修改型的小项目,为了学习了解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


 


 



 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
9
关闭 站长推荐上一条 /3 下一条