FATFS檔案系統常用指令
FATFS檔案系統常用指令
一、說明
以官網下載的 ff12b 版本為例,定義變數舉例。
FRESULT res; /* 檔案操作結果 */
FATFS fs; /* FatFs檔案系統物件 */
FIL fp; /* 檔案物件 */
UINT br; /* 檔案成功寫入數量 */
UINT bw; /* 檔案成功讀取數量 */
BYTE read_buffer[_MAX_SS]= {0}; /* 讀緩衝區 */
BYTE write_buf[] = "hello";/* 寫緩衝區*/
二、指令
1、f_mkfs
在驅動器上建立一個檔案系統
FRESULT f_mkfs (
const TCHAR* path, /* 邏輯驅動器號 */
BYTE opt, /* 格式選項 */
DWORD au, /* 分配單元[位元組]的大小 */
void* work, /* 指向工作緩衝區的指標 */
UINT len /* 工作緩衝器大小 */
)
例:
//在邏輯驅動器0上建立一個格式為FAT32的檔案系統,緩衝區的大小為_MAX_SS = 4096
res = f_mkfs("0:",FM_FAT32,0,read_buffer,sizeof(read_buffer));
f_mkfs 函式當 _FS_READOLNY == 0 並且 _USE_MKFS == 1 時可用。
f_mkfs 函式在驅動器中建立一個 FAT 檔案系統。對於可移動媒介,有兩種分割槽規則: FDISK 和 SFD ,通過引數PartitioningRule 選擇。 FDISK 格式在大多數情況下被推薦使用。該函式當前不支援多分割槽,因此,物理驅動器上已存在的分割槽將被刪除,並且重新建立一個佔據全部磁碟空間的新分割槽。
根據 Microsoft 釋出的 FAT 規範, FAT 分類: FAT12/FAT16/FAT32 ,由驅動器上的簇數決定。因此,選擇哪種 FAT 分類,取決於卷大小和指定的簇大小。簇大小影響檔案系統的效能,並且大簇會提高效能。
2、f_mount
檔案掛載/取消掛載指令。FatFs 模組上註冊 / 登出一個工作區。 在使用任何其他檔案函式之前,必須使用該函式為每個卷註冊一個工作區。要登出一個工作區,只要指定 FileSystemObject 為 NULL 即可,然後該工作區可以被丟棄。
FRESULT f_mount (
FATFS* fs, /* 指向檔案系統物件的指標(NULL:解除安裝)*/
const TCHAR* path, /* 要掛載/解除安裝的邏輯驅動器號 */
BYTE opt /* 模式選項0:不掛載(延遲掛載),1:立即掛載 */
)
例:
res = f_mount(fs,"0:",1); //掛載
res = f_mount(NULL,"0:",1); //取消掛載
3、f_open
建立 / 開啟一個用於訪問檔案的檔案物件。
FRESULT f_open (
FIL* fp, /* 指向空白檔案物件的指標 */
const TCHAR* path, /* 指向檔名的指標 */
BYTE mode /* 訪問模式和檔案開啟模式標誌 */
)
例:
//開啟讀寫許可權,建立一個新檔案。如果檔案已存在,則它將被截斷並覆蓋。
res = f_open(&fp, "0:test.txt", FA_READ|FA_WRITE|FA_CREATE_ALWAYS);
模式 | 描述 |
---|---|
FA_READ | 指定讀訪問物件。可以從檔案中讀取資料。與 FA_WRITE 結合可以進行讀寫訪問。 |
FA_WRITE | 指定寫訪問物件。可以向檔案中寫入資料。與 FA_READ 結合可以進行讀寫訪問。 |
FA_OPEN_EXISTING | 開啟檔案。如果檔案不存在,則開啟失敗。 ( 預設 ) |
FA_OPEN_ALWAYS | 如果檔案存在,則開啟;否則,建立一個新檔案 |
FA_CREATE_NEW | 建立一個新檔案。如果檔案已存在,則建立失敗。 |
FA_CREATE_ALWAYS | 建立一個新檔案。如果檔案已存在,則它將被截斷並覆蓋。 |
注意:當 _FS_READONLY ==1 時,模式標誌 FA_WRITE, FA_CREATE_ALWAYS, FA_CREATE_NEW, FA_OPEN_ALWAYS 是無效的。
如果函式成功,則建立一個檔案物件。該檔案物件被後續的讀 / 寫函式用來訪問檔案。如果想要關閉一個開啟的檔案物件,則使用 f_close 函式。如果不關閉修改後的檔案,那麼檔案可能會崩潰。 在使用任何檔案函式之前,必須使用 f_mount 函式為驅動器註冊一個工作區。只有這樣,其他檔案函式才能正常工作。
4、f_close
關閉一個開啟的檔案
FRESULT f_close (
FIL* fp /* 指向要關閉的檔案物件的指標 */
)
例:
res = f_close(&fp); //關閉fp檔案。
f_close 函式關閉一個開啟的檔案物件。無論向檔案寫入任何資料,檔案的快取資訊都將被寫回到磁碟。該函式成功後,檔案物件不再有效,並且可以被丟棄。如果檔案物件是在只讀模式下開啟的,不需要使用該函式,也能被丟棄。
5、f_read
從一個檔案讀取資料
從一個檔案讀取資料
FRESULT f_read (
FIL* fp, /* 指向檔案物件的指標 */
void* buff, /* 資料緩衝區指標 */
UINT btr, /* 要讀取的位元組數*/
UINT* br /* 指標指向讀取的位元組數 */
)
例:
//將fp檔案裡的內容讀取到read_buf緩衝區,返回讀取位元組數br
res = f_read(&fp, read_buf, sizeof(write_buf), &br);
檔案物件中的讀 / 寫指標以已讀取位元組數增加。該函式成功後,應該檢查 *ByteRead 來檢測檔案是否結束。在讀操作過程中,一旦 *ByteRead < ByteToRead ,則讀 / 寫指標到達了檔案結束位置。
6、f_write
寫入資料到一個檔案
FRESULT f_write (
FIL* fp, /* 指向檔案物件的指標 */
const void* buff, /* 指向要寫入的資料的指標 */
UINT btw, /* 要寫入的位元組數 */
UINT* bw /* 指向寫入的位元組數的指標 */
)
//write_buf陣列的內容寫入到fp檔案中,返回寫入位元組數bw
res = f_write(&fp, write_buf, sizeof(write_buf), &bw);
檔案物件中的讀 / 寫指標以已寫入位元組數增加。該函式成功後,應該檢查 *ByteWritten 來檢測磁碟是否已滿。在寫操作過程中,一旦 *ByteWritten < *ByteToWritten ,則意味著該卷已滿。
7、f_lseek
跳轉指令,移動一個開啟的檔案物件的檔案讀 / 寫指標。也可以被用來擴充套件檔案大小 ( 簇預分配 ) 。
FRESULT f_lseek (
FIL* fp, /* 指向檔案物件的指標 */
FSIZE_t ofs /* 檔案指標從檔案的頂部 */
)
例:
f_lseek(&Fp, 0); // 讀/寫指標偏移0個位元組
8、f_tell
獲取當前讀/寫指標,函式原型是FIL結構體中成員變數fptr。
#define f_tell(fp) ((fp)->fptr) //
例:
uint32_t Drv_FatfsTell(void)
{
return f_tell(&Fp); //返回指標
}
9、f_size
獲取一個檔案大小,函式原型是FIl結構體成員_FDID obj結構體成員objsize
#define f_size(fp) ((fp)->obj.objsize)
例:
uint32_t Drv_FatfsSize(void)
{
return f_size(&Fp); //返回指標
}
10、f_opendir
11、f_readdir
f_opendir(開啟一個目錄)
FRESULT f_opendir (
DIR* dp, /* 要建立的目錄物件的指標 */
const TCHAR* path /* 指向目錄路徑的指標 */
)
f_readdir(讀取目錄項 )
FRESULT f_readdir (
DIR* dp, /* 指向開目錄物件的指標 */
FILINFO* fno /* 返回檔案資訊的指標 */
)
兩者配合使用,可以遍歷檔案,讀取出檔案路徑和檔名。
例:
void Drv_FatfsReaddir(void)
{
DIR dir; //目錄
FILINFO fileinfo; //檔案資訊
FRESULT Res; /* 返回狀態值 */
Res = f_opendir(&dir, (const TCHAR*)DriveNumber);
while(1)
{
Res = f_readdir(&dir, &fileinfo);
if (Res != FR_OK || fileinfo.fname[0] == 0) break;
printf("%s", DriveNumber);//列印路徑
printf("%s \r\n", fileinfo.fname);//列印檔名
}
}
12、f_getfree
獲取空閒簇的數目 ,也就是獲取出空閒扇區的數量,同時也可過去總扇區數量。
FRESULT f_getfree (
const TCHAR* path, /* 邏輯驅動器號的路徑名 */
DWORD* nclst, /* 指向一個變數的指標,該變數返回空閒叢集的數量 */
FATFS** fatfs /* 返回指向相應檔案系統物件的指標 */
)
例:
uint32_t Drv_FatfsGetfree(void)
{
FRESULT Res; /* 返回狀態值 */
FATFS *Fs1;
uint32_t FreClust=0; //空閒叢集的數量
uint32_t FreSect=0; //空閒扇區數
// uint32_t TotSect=0; //總扇區數
Res = f_getfree(DriveNumber, (DWORD*)&FreClust, &Fs1);
if(Res == FR_OK)
{
//TotSect = (Fs1->n_fatent - 2) * Fs1->csize; //得到總扇區數
FreSect = FreClust * Fs1->csize; //得到空閒扇區數
return FreSect; //返回空閒扇區數
}
return 0;
}
三、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 - 測試一個檔案是否出錯
三、文件引用連結
連結: https://blog.csdn.net/limanjihe/article/details/52302711.
四、寫此文件
相關文章
- 【檔案系統】嵌入式檔案系統Fatfs簡介
- STM32FATFS檔案系統移植
- linux系統下svn常用指令Linux
- node.js常用的fs檔案系統Node.js
- Linux系統中建立檔案常用的方法!Linux
- Linux系統中常用的檔案檢視命令Linux
- Linux系統篇-檔案系統&虛擬檔案系統Linux
- Linux系統配置檔案簡易shell備份指令碼Linux指令碼
- 檔案和檔案系統
- 檔案系統
- 針對大型檔案系統可以試試此 Bash 指令碼指令碼
- Linux系統常見檔案大小常用的命令詳解!Linux
- Linux系統檢視檔案地址常用的命令詳解!Linux
- 檔案系統(五):exFAT 檔案系統原理詳解
- Linux系統檔案系統及檔案基礎篇Linux
- 分散式檔案系統(HDFS)與 linux系統檔案系統 對比分散式Linux
- 檔案系統(十):一文看懂 UBI 檔案系統
- Linux如何檢視檔案包含內容?常用指令有哪些?Linux
- Hadoop HDFS分散式檔案系統 常用命令彙總Hadoop分散式
- Linux系統中檔案時間常用的三種型別!Linux型別
- Linux系統下systemctl常用命令以及service檔案配置Linux
- debugfs檔案系統
- Linux檔案系統Linux
- FUSE檔案系統
- 檔案系統安全
- [Linux]檔案系統Linux
- 檔案系統(四):FAT32檔案系統實現原理
- 檔案系統(十一):Linux Squashfs只讀檔案系統介紹Linux
- 檔案描述符和檔案系統
- 根檔案系統簡介與BusyBox構建根檔案系統
- pyc檔案花指令
- exFAT 檔案系統指南
- 分散式檔案系統分散式
- 論Linux檔案系統Linux
- Linux AUFS 檔案系統Linux
- linux的檔案系統Linux
- 檔案系統基礎
- Mac的檔案系統Mac