ff.h :文件系統實現頭文件,定義有文件系統所需的數據結構緩存
diskio.h :底層驅動頭文件,就一些狀態宏的定義和底層驅動函數的申明數據結構
integer.h:僅實現數據類型重定義,增長系統的可移植性函數
ffconf.h :文件系統配置測試
ff.c :文件系統實現。spa
diskio.c 底層驅動指針
/* File system object structure (FATFS) */ typedef struct { BYTE fs_type; /* FAT子類型,通常在mount時用,置0表示未掛載*/ BYTE drv; /* 物理驅動號,通常爲0*/ BYTE csize; /* 每一個簇的扇區數目(1,2,4...128) */ BYTE n_fats; /* 文件分配表的數目(1,2) */ /*FAT文件系統依次爲:引導扇區、兩個文件分配表、根目錄區和數據區*/ BYTE wflag; /* 標記文件是否被改動過,爲1時要回寫*/ BYTE fsi_flag; /* 標記文件系統信息是否被改動過,爲1時要回寫*/ WORD id; /* 文件系統掛載ID */ WORD n_rootdir; /* 根目錄區入口(目錄項)的個數(用於FAT12/16)*/ #if _MAX_SS != 512 WORD ssize; /* 每扇區的字節數(用於扇區大於512Byte的flash) */ #endif #if _FS_REENTRANT _SYNC_t sobj; /* 容許重入,即定義同步對象,用在tiny中*/ #endif #if !_FS_READONLY DWORD last_clust; /* 最後一個被分配的簇*/ DWORD free_clust; /* 空閒簇的個數*/ DWORD fsi_sector; /* 存放fsinfo的扇區(用於FAT32) */ #endif #if _FS_RPATH DWORD cdir; /* 容許相對路徑時用,存儲當前目錄起始簇(0:root)*/ #endif DWORD n_fatent; /* FAT入口數(簇的數目 + 2)*/ DWORD fsize; /* 每一個FAT所佔扇區*/ DWORD fatbase; /* FAT起始扇區*/ DWORD dirbase; /* 根目錄起始扇區(FAT32:Cluster#) */ DWORD database; /* 數據目錄起始扇區*/ DWORD winsect; /* 當前緩衝區中存儲的扇區號*/ BYTE win[_MAX_SS]; /* 單個扇區緩存*/ } FATFS;
文件結構體code
/* File object structure (FIL) */ typedef struct { FATFS* fs; /* 所在的fs指針*/ WORD id; /* 所在的fs掛載編號*/ BYTE flag; /* 文件狀態*/ BYTE pad1; /* 不知道含義,也未見程序使用*/ DWORD fptr; /* 文件讀寫指針*/ DWORD fsize; /* 大小*/ DWORD sclust; /* 文件起始簇(fsize=0時爲0) */ DWORD clust; /* 當前簇*/ DWORD dsect; /* 當前數據扇區*/ #if !_FS_READONLY DWORD dir_sect; /* 包含目錄項的扇區 */ BYTE* dir_ptr; /* Ponter to the directory entry in the window */ #endif #if _USE_FASTSEEK DWORD* cltbl; /*指向簇連接映射表的指針*/ #endif #if _FS_SHARE UINT lockid; /* File lock ID (index of file semaphore table) */ #endif #if !_FS_TINY BYTE buf[_MAX_SS]; /* File data read/write buffer */ #endif } FIL;
目錄結構體htm
/* Directory object structure (DIR) */ typedef struct { FATFS* fs; /* 同上*/ WORD id; WORD index; /* 當前讀寫索引號 */ DWORD sclust; /* 文件數據區開始簇*/ DWORD clust; /* 當前簇*/ DWORD sect; /* 當前扇區*/ BYTE* dir; /* 扇區緩存中當前SFN入口指針,SFN含義未知,猜想和LFN相似,與文件名相關*/ BYTE* fn; /* Pointer to the SFN (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;
f_mount - 註冊/註銷一個工做區域(Work Area)對象
f_open - 打開/建立一個文件f_close - 關閉一個文件索引
f_read - 讀文件f_write - 寫文件
f_lseek - 移動文件讀/寫指針
f_truncate - 截斷文件
f_sync - 沖洗緩衝數據 Flush Cached Data
f_opendir - 打開一個目錄
f_readdir - 讀取目錄條目
f_getfree - 獲取空閒簇 Get Free Clusters
f_stat - 獲取文件狀態
f_mkdir - 建立一個目錄
f_unlink - 刪除一個文件或目錄
f_chmod - 改變屬性(Attribute)
f_utime - 改變時間戳(Timestamp)
f_rename - 重命名/移動一個文件或文件夾
f_mkfs - 在驅動器上建立一個文件系統
f_forward - 直接轉移文件數據到一個數據流 Forward file data to the stream directly
f_gets - 讀一個字符串
f_putc - 寫一個字符
f_puts - 寫一個字符串
f_printf - 寫一個格式化的字符磁盤I/O接口
f_tell - 獲取當前讀/寫指針
f_eof - 測試一個文件是否到達文件末尾
f_size - 獲取一個文件大小
f_error - 測試一個文件是否出錯
由於FatFs模塊徹底與磁盤I/O層分開,所以須要下面的函數來實現底層物理磁盤的讀寫與獲取當前時間。底層磁盤I/O模塊並非FatFs的一部分,而且必須由用戶提供。
disk_initialize - Initialize disk drive 初始化磁盤驅動器
disk_status - Get disk status 獲取磁盤狀態
disk_read - Read sector(s) 讀扇區
disk_write - Write sector(s) 寫扇區
disk_ioctl - Control device dependent features 設備相關的控制特性
get_fattime - Get current time 獲取當前時間
打開文件數量:無限制,與可用內存有關。 卷(volume)數量:最多10個。
文件大小:與FAT規範有關(最大4G-1字節)。
卷大小:與FAT規範有關(在512字節/扇區上,最大2T字節)
簇(Cluster)大小:與FAT規範有關(在512字節/扇區上,最大64K字節) 扇區(Sector)大小:與FAT規範有關(最大4K字節)
1)f_mount(0, &fatFS); /* 掛載文件系統 */
2)f_mkfs(0,1,512); //建立文件系統
FRESULT f_mkfs (
BYTE Drive, /* 邏輯驅動器號 */
BYTE PartitioningRule, /* 分區規則 */
WORD AllocSize /* 分配單元大小 */);
分區規則:當給定0時,首先在驅動器上的第一個扇區建立一個分區表,而後文件系統被建立在分區上。這被稱爲FDISK格式化,用於硬盤和存儲卡。當給定1時,文件系統從第一個扇區開始建立,而沒有分區表。這被稱爲超級軟盤(SFD)格式化,用於軟盤和可移動磁盤。
3)f_getfree("0:", &fre_clust, &fs2) //得到磁盤存儲空間大小
4)f_open(&file1, "/srcfile.txt", FA_OPEN_ALWAYS | FA_READ | FA_WRITE); //打開文件
FIL file1;
5)f_puts(cDataBuf, &file1); //將cDataBuf[]數據寫入 文件srcfile.txt
6)f_sync (&file1); //刷新文件
7)f_lseek(&file1, 0); //從文件 偏移字節0出開始讀文件
8)f_read(&file1, buffer, 10,&r); //讀出10個字節到 buffer[]中
9)f_close(&file1); //操做完成 關閉文件
建立目錄例程
1) f_chdir("0:"); //切換到根目錄
2)f_mkdir("folder"); //建立目錄 folder
3)f_open(&file1, "folder/oldname2.txt", FA_CREATE_ALWAYS | FA_WRITE); //打開folder目錄下的文件
4)f_close(&file1); //關閉文件