FATFS文件系统剖析2: 分析下ff.h和ff.c两个文件。 先来分析ff.h中定义的几个结构体: typedef struct {
BYTE fs_type; // 系统类型,为0时系统没有被挂载 BYTE drv; // 物理磁盘驱动号
BYTE csize; // 每簇的扇区数目, 簇是文件数据分配的基本单位 BYTE n_fats; // 文件分配表的数目,一般为两个(一个备份fat表) //Fatfs文件系统应该是:引导扇区,文件分配表2个,根目录区,和数据区
BYTE wflag; // 文件活动窗体是否改动标志,为1要回写 BYTE fsi_flag; // 文件信息回写标志 WORD id; // 文件系统加载id号
WORD n_rootdir; // 根目录区目录项数目(针对FAT12/16,FAT32不使用) #if _MAX_SS != 512
WORD ssize; // 每扇区多少字节 #endif
#if _FS_REENTRANT
_SYNC_t sobj; // 允许重入,则定义同步对象 #endif
#if !_FS_READONLY
DWORD last_clust; // 最新分配的簇 DWORD free_clust; // 空闲簇
DWORD fsi_sector; // 文件信息扇区(仅用于FAT32) #endif
#if _FS_RPATH
DWORD cdir; //使用相对路径,文件系统的当前起始路径 0(root 路径) #endif
DWORD n_fatent; //文件分配表占用的扇区 n_fatent=数据簇数目+2 DWORD fsize; //每FAT表有多少个扇区 DWORD fatbase; //文件分配表开始扇区
DWORD dirbase; // 如果是FAT32,根目录开始扇区需要首先得到 DWORD database; // 数据起始扇区 DWORD winsect; // win中当前指定的扇区 BYTE win[_MAX_SS]; //扇区操作缓存 } FATFS; typedef struct {
FATFS* fs; // 指向的文件系统
WORD id; // 自身文件系统挂载id号 即 fs->id BYTE flag; // 文件状态
BYTE pad1; //文件在簇里面扇区偏移 (0--fs->csize) DWORD fptr; //文件当前读写指针位置,当文件打开时为0 DWORD fsize; //文件大小(按字节计算)
DWORD org_clust; // 文件起始簇 (0 when fsize==0) DWORD curr_clust; // 文件当前操作簇 DWORD dsect; // 文件当前操作扇区 #if !_FS_READONLY
DWORD dir_sect; // 包含路径入口的扇区号 BYTE* dir_ptr; // 目录入口指针 #endif
#if _USE_FASTSEEK
DWORD* cltbl; //指向查找映射表的簇 (null on file open) #endif
#if _FS_SHARE
UINT lockid; // 文件锁 ID号 (index of file semaphore table) #endif #if !_FS_TINY
BYTE buf[_MAX_SS]; // 文件读写缓存 #endif } FIL;
typedef struct {
FATFS* fs; // 对应的文件系统
WORD id; // 自身文件系统挂载id号 即 fs->id
WORD index; // 目前读写索引号 /* Current read/write index number */ DWORD sclust; // 目录表起始簇 (0:Root dir) DWORD clust; // 目前处理的簇 DWORD sect; // 目前簇里对应的扇区
BYTE* dir; //指向当前在win[]中的短文件名入口项/* Pointer to the current SFN entry in the win[]
BYTE* fn; //指向短文件名 (in/out) {file[8],ext[3],status[1]} #if _USE_LFN
WCHAR* lfn; //指向长文件名缓冲 /* Pointer to the LFN working buffer */ WORD lfn_idx; /* Last matched LFN index number (0xFFFF:No LFN) */ #endif } DIR;
typedef struct { //文件目录表项 大小=4+2+2+1+13 DWORD fsize; /* File size */ WORD fdate; /* Last modified date */