c語言中有關FatFs的操作程式碼
文章完全是從http://blog.csdn.net/qsycn/article/details/9226403貼上過來的,怕原版找不到,所以自己貼上過來一份。
FatFs
FatFS是一個為小型嵌入式系統設計的通用FAT(File Allocation Table)檔案系統模組。FatFs 的編寫遵循ANSI C,並且完全與磁碟I/O層分開。因此,它獨立(不依賴)於硬體架構。它可以被嵌入到低成本的微控制器中,如AVR, 8051, PIC, ARM, Z80, 68K 等等,而不需要做任何修改。
Windows相容的FAT檔案系統[編輯] 特點
- 不依賴於平臺,易於移植
- 程式碼和工作區佔用空間非常小
- 多種配置選項:
- 多卷(物理驅動器和分割槽)
- 多ANSI/OEM內碼表,包括DBCS
- 在ANSI/OEM或Unicode中長檔名的支援
- RTOS的支援
- 多扇區大小的支援
- 只讀,最少API,I/O緩衝區等等
[編輯] 應用程式介面
FatFs 模組為應用程式提供了下列函式,這些函式描述了FatFs能對FAT卷執行哪些操作。
[編輯] f_mount
在FatFs模組上註冊/登出一個工作區(檔案系統物件)
FRESULT f_mount ( BYTE Drive, /* 邏輯驅動器號 */ FATFS* FileSystemObject /* 工作區指標 */ );
- 引數
Drive
- 註冊/登出工作區的邏輯驅動器號(0-9)。
FileSystemObject
- 工作區(檔案系統物件)指標。
- 返回值
FR_OK (0)
- 函式成功。
FR_INVALID_DRIVE
- 驅動器號無效
- 描述
f_mount函式在FatFs模組上註冊/登出一個工作區。 在使用任何其他檔案函式之前,必須使用該函式為每個卷註冊一個工作區。要登出一個工作區,只要指定FileSystemObject為NULL即可,然後該工作區可以被丟棄。
該函式只初始化給定的工作區,以及將該工作區的地址註冊到內部表中,不訪問磁碟I/O層。卷裝入過程是在f_mount函式後或儲存介質改變後的第一次檔案訪問時完成的。
[編輯] f_open
建立/開啟一個用於訪問檔案的檔案物件
FRESULT f_open ( FIL* FileObject, /* 空白檔案物件結構指標 */ const XCHAR* FileName, /* 檔名指標 */ BYTE ModeFlags /* 模式標誌 */ );
- 引數
FileObject
- 將被建立的檔案物件結構的指標。
FileName
- NULL結尾的字串指標,該字串指定了將被建立或開啟的檔名。
ModeFlags
- 指定檔案的訪問型別和開啟方法。它是由下列標誌的一個組合指定的。
-
模式 描述 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 是無效的。
- 返回值
FR_OK (0)
- 函式成功,該檔案物件有效。
FR_NO_FILE
- 找不到該檔案。
FR_NO_PATH
- 找不到該路徑。
FR_INVALID_NAME
- 檔名無效。
FR_INVALID_DRIVE
- 驅動器號無效。
FR_EXIST
- 該檔案已存在。
FR_DENIED
-
由於下列原因,所需的訪問被拒絕:
- 以寫模式開啟一個只讀檔案。
- 由於存在一個同名的只讀檔案或目錄,而導致檔案無法被建立。
- 由於目錄表或磁碟已滿,而導致檔案無法被建立。
FR_NOT_READY
- 由於驅動器中沒有儲存介質或任何其他原因,而導致磁碟驅動器無法工作。
FR_WRITE_PROTECTED
- 在儲存介質被防寫的情況下,以寫模式開啟或建立檔案物件。
FR_DISK_ERR
- 由於底層磁碟I/O介面函式中的一個錯誤,而導致該函式失敗。
FR_INT_ERR
- 由於一個錯誤的FAT結構或一個內部錯誤,而導致該函式失敗。
FR_NOT_ENABLED
- 邏輯驅動器沒有工作區。
FR_NO_FILESYSTEM
- 磁碟上沒有有效地FAT卷。
- 描述
如果函式成功,則建立一個檔案物件。該檔案物件被後續的讀/寫函式用來訪問檔案。如果想要關閉一個開啟的檔案物件,則使用f_close函式。如果不關閉修改後的檔案,那麼檔案可能會崩潰。
在使用任何檔案函式之前,必須使用f_mount函式為驅動器註冊一個工作區。只有這樣,其他檔案函式才能正常工作。
- 例子(檔案拷貝)
void main (void) { FATFS fs[2]; /* 邏輯驅動器的工作區(檔案系統物件) */ FIL fsrc, fdst; /* 檔案物件 */ BYTE buffer[4096]; /* 檔案拷貝緩衝區 */ FRESULT res; /* FatFs 函式公共結果程式碼 */ UINT br, bw; /* 檔案讀/寫位元組計數 */ /* 為邏輯驅動器註冊工作區 */ f_mount(0, &fs[0]); f_mount(1, &fs[1]); /* 開啟驅動器 1 上的原始檔 */ res = f_open(&fsrc, "1:srcfile.dat", FA_OPEN_EXISTING | FA_READ); if (res) die(res); /* 在驅動器 0 上建立目標檔案 */ res = f_open(&fdst, "0:dstfile.dat", FA_CREATE_ALWAYS | FA_WRITE); if (res) die(res); /* 拷貝原始檔到目標檔案 */ for (;;) { res = f_read(&fsrc, buffer, sizeof(buffer), &br); if (res || br == 0) break; /* 檔案結束錯誤 */ res = f_write(&fdst, buffer, br, &bw); if (res || bw < br) break; /* 磁碟滿錯誤 */ } /* 關閉開啟的檔案 */ f_close(&fsrc); f_close(&fdst); /* 登出工作區(在廢棄前) */ f_mount(0, NULL); f_mount(1, NULL); }
[編輯] f_close
關閉一個開啟的檔案
FRESULT f_close ( FIL* FileObject /* 檔案物件結構的指標 */ );
- 引數
FileObject
- 指向將被關閉的已開啟的檔案物件結構的指標。
- 返回值
FR_OK (0) 檔案物件已被成功關閉。 >FR_DISK_ERR 由於底層磁碟I/O函式中的錯誤,而導致該函式失敗。 FR_INT_ERR
- 由於一個錯誤的FAT結構或一個內部錯誤,而導致該函式失敗。
FR_NOT_READY
- 由於驅動器中沒有儲存介質或任何其他原因,而導致磁碟驅動器無法工作。
FR_INVALID_OBJECT
- 檔案物件無效。
- 描述
f_close函式關閉一個開啟的檔案物件。無論向檔案寫入任何資料,檔案的快取資訊都將被寫回到磁碟。該函式成功後,檔案物件不再有效,並且可以被丟棄。如果檔案物件是在只讀模式下開啟的,不需要使用該函式,也能被丟棄。
[編輯] f_read
從一個檔案讀取資料
FRESULT f_read ( FIL* FileObject, /* 檔案物件結構的指標 */ void* Buffer, /* 儲存讀取資料的緩衝區的指標 */ UINT ByteToRead, /* 要讀取的位元組數 */ UINT* ByteRead /* 返回已讀取位元組數變數的指標 */ );
- 引數
FileObject
- 指向將被讀取的已開啟的檔案物件結構的指標。
Buffer
- 指向儲存讀取資料的緩衝區的指標。
ByteToRead
- 要讀取的位元組數,UINT範圍內。
ByteRead
- 指向返回已讀取位元組數的UINT變數的指標。在呼叫該函式後,無論結果如何,數值都是有效的。
- 返回值
FR_OK (0)
- 函式成功。
FR_DENIED
- 由於檔案是以非讀模式開啟的,而導致該函式被拒絕。
FR_DISK_ERR
- 由於底層磁碟I/O函式中的錯誤,而導致該函式失敗。
FR_INT_ERR
- 由於一個錯誤的FAT結構或一個內部錯誤,而導致該函式失敗。
FR_NOT_READY
- 由於驅動器中沒有儲存介質或任何其他原因,而導致磁碟驅動器無法工作。
FR_INVALID_OBJECT 檔案物件無效。
- 描述
檔案物件中的讀/寫指標以已讀取位元組數增加。該函式成功後,應該檢查 *ByteRead 來檢測檔案是否結束。在讀操作過程中,一旦 *ByteRead < ByteToRead ,則讀/寫指標到達了檔案結束位置。
[編輯] f_write
寫入資料到一個檔案
FRESULT f_write ( FIL* FileObject, /* 檔案物件結構的指標 */ const void* Buffer, /* 儲存寫入資料的緩衝區的指標 */ UINT ByteToWrite, /* 要寫入的位元組數 */ UINT* ByteWritten /* 返回已寫入位元組數變數的指標 */ );
- 引數
FileObject
- 指向將被寫入的已開啟的檔案物件結