FatFS文件系統介紹及使用例程

FatFS文件系統包含了文件

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;

FatFs 提供下面的函數API:

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 獲取當前時間

FatFS系統特性

打開文件數量:無限制,與可用內存有關。 卷(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);    //關閉文件

相關文章
相關標籤/搜索