1. 程式人生 > >c語言中有關FatFs的操作程式碼

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

指向將被寫入的已開啟的檔案物件結