精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-06-06
最后修改:2009-06-06
关于文件在FAT32磁盘扇区中的绝对定位 首先我们应该了解FAT32的基本结构(树形结构) 我们首先要明白 FAT32文件系统DBR(引导扇区),FAT,FDT,DATA这四个基本结构: 1.DBR:DBR记录了当前FAT32 磁盘的一些基本信息,在通常情况下,DBR位于磁盘分区的0号逻辑扇区 在附件中有幅 DBR的图形信息,里面详细说明了在DBR中我们能获取到哪些主要信息,当然,还有很多信息希望读者自己去查阅详 相关资料,我们首先需要获取到DBR中的一些详细信息才能进一步定位文件。 2 FDT:FDT区简单的说就是记录的目录(文件夹)的信息,里面记录了当前目录下所有的文件(包括当前目录下的文件 夹名)的信息,说通俗一点就是记录了当前目录下的所有文件的文件名,我们定位文件,必须要定位到该文件所在目 录的FDT区的位置。 3 FAT:FAT区在FAT32文件系统中有2个:FAT1与FAT2,FAT2是FAT1的备份,所以我们只需要获取FAT1的位置,FAT区 所在的扇区号我们可以由DBR获取,那FAT区究竟是什么呢?首先,我们知道磁盘是由扇区组成的,若干的扇区组成一 簇,当一个目录的FDT区需要占据多个簇的时候,FAT区记录了多个簇的连接信息,具体可以详细去查阅有关资料。 4 DATA:DATA区是由FDT区定位的,上面说过FDT区记录了某个目录下文件的信息,若这个信息记录的是文件而非文件 夹(目录),则这个信息的一部分记录了这个文件的DATA区的位置,顾名思义,DATA区储存了文件的内容,当一个 簇无法记录一个完整的文件内容时,就要用到FAT区进行簇连。
下面我将详细介绍如何用C/C++实现指定文件在FAT32文件系统中的绝对定位: 定位文件所在的DATA区,必须读取扇区。C/C++中 我们使用windows.h提供的CreateFile,CreateFile2个函数实现 读取扇区,函数的使用方法请查阅详相关资料。 下面我们举个例子 假设我要定位 C:\a\b\c.txt 这个文件 1.读取0号扇区DBR,获取详关信息,具体我们需要得到:1根目录FDT区的首簇号 2每簇所拥有的扇区数 3FAT区的首扇区号 4保留扇区号 5FAT区的长度 6FAT区数 2.我们获取了根目录FDT区的首簇号,根据公式:首扇区号=保留扇区+FAT区数*AT区的长度+(当前簇号-2)*每簇所拥 有的扇区数 这个公式 计算出首扇区 根据上面FDT区的介绍 我们知道根目录的FDT区一定记录了a这个目录的信息,那 我们逐个扇区读取并扫描(注意簇连)获得了b这个目录的目录信息,然后分析信息,得到b这个目录的FDT区。 3.同上,在b的FDT区中,我们获取了c.txt这个文件的信息,并由获取的信息得到了这个文件DATA区的扇区号,从而定位 成功。
FAT32文件系统就是一个树型结构 在定位文件中我们要注意:1.簇连问题 2.长文件名可能记录在2个扇区中,定位起来有点难度 3.中文编码问题
如何读者有什么疑问,请给我留言,一定回答。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-07-17
能写出一个关于任意文件读出其占用簇地址
或者是首地址吗? 最近看了这么多关于fat32的东西好像有些思路,但是感觉好像很麻烦啊! |
|
返回顶楼 | |
发表时间:2009-07-17
恩 可以 这是数据结构的问题 我可以公布code给你参考 给你QQ 412163774
|
|
返回顶楼 | |
浏览 4493 次