//设置目录条目索引值。
//返回0表示成功
//返回非0表示错误
/*
dp为目录对象。
ofs为目录条目的偏移量,单位为字节。
n = ofs / SZDIRE:表示第n个条目,n从0开始。
首先ofs不能超过目录存储的最大字节数。MAX_DIR_EX/MAX_DIR
其次,ofs必须是SZDIRE的倍数
fat16是固定位置根目录:通过DBR中根目录首扇区号获得
fat32/exfat根目录位置:通过DBR中提供的根目录首蔟号获得
给定ofs值需要计算:
1、蔟号:ofs指定的目录条目在哪个蔟
2、扇区号:ofs指定的目录条目在哪个扇区
3、扇区中偏移量:ofs在扇区中偏移了几个条目
获取上述信息,可将扇区内容读到win中,根据偏移量可以找到对应条目(32字节)
fat16文件系统:
由于根目录不在数据区,因此蔟号为0
根目录的起始扇区号:fs->dirbase
ofs对应扇区号:起始扇区号 + 扇区偏移量 = fs->dirbase + ofs / SS(fs)
扇区内偏移量:ofs % SS(fs)
fat32/exfat文件系统:
根目录的起始蔟号:fs->dirbase
ofs对应蔟号:通过在fat表中蔟链查找到ofs对应的蔟(ofs/每蔟字节数)
扇区号:通过clst2sect函数得到蔟首扇区号
ofs % 每蔟字节数 = 对应蔟号中的偏移字节数
对应蔟号中的偏移字节数 / SS(fs)为蔟内扇区偏移量
扇区内偏移量:对应蔟号中的偏移字节数 % SS(fs)为扇区内条目偏移字节
*/
static FRESULT dir_sdi ( /* FR_OK(0):succeeded, !=0:error */
DIR* dp,//目录对象。/* Pointer to directory object */
DWORD ofs//目录表偏移量。/* Offset of directory table */
)
{
DWORD csz, clst;
FATFS *fs = dp->obj.fs;
//偏移量不能超过最大目录数
//偏移量必须是32的倍数
if (ofs >= (DWORD)((