今天来分析下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; //文件大小(按字