FATFS檔案系統常用指令

qq_39772670發表於2020-11-19

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.

四、寫此文件

相關文章