最新版 FatFS f_open詳解 時間 2014-03-21 16:21:21 程序員玩耍的小窩 原文 http://www./post-202.html 主題 技術(shù) 作者:fly發(fā)布于:2014-3-21 16:23 分類:嵌入式 f_open 創(chuàng)建/打開一個用于訪問文件的文件對象 FRESULT f_open ( FIL* FileObject, /* 空白文件對象結(jié)構(gòu)指針 */ const XCHAR* FileName, /* 文件名指針 */ BYTE ModeFlags /* 模式標(biāo)志 */ ); 參數(shù) FileObject 將被創(chuàng)建的文件對象結(jié)構(gòu)的指針。 FileName NULL結(jié)尾的字符串指針,該字符串指定了將被創(chuàng)建或打開的文件名。 ModeFlags 指定文件的訪問類型和打開方法。它是由下列標(biāo)志的一個組合指定的。 模式 描述 FA_READ 指定讀訪問對象。可以從文件中讀取數(shù)據(jù)。 與FA_WRITE結(jié)合可以進(jìn)行讀寫訪問。 FA_WRITE 指定寫訪問對象。可以向文件中寫入數(shù)據(jù)。 與FA_READ結(jié)合可以進(jìn)行讀寫訪問。 FA_OPEN_EXISTING 打開文件。如果文件不存在,則打開失敗。(默認(rèn)) FA_OPEN_ALWAYS 如果文件存在,則打開;否則,創(chuàng)建一個新文件。 FA_CREATE_NEW 創(chuàng)建一個新文件。如果文件已存在,則創(chuàng)建失敗。 FA_CREATE_ALWAYS 創(chuàng)建一個新文件。如果文件已存在,則它將被截斷并覆蓋。 注意:當(dāng) _FS_READONLY == 1 時,模式標(biāo)志 FA_WRITE, FA_CREATE_ALWAYS, FA_CREATE_NEW, FA_OPEN_ALWAYS 是無效的。 返回值 FR_OK (0) 函數(shù)成功,該文件對象有效。 FR_NO_FILE 找不到該文件。 FR_NO_PATH 找不到該路徑。 FR_INVALID_NAME 文件名無效。 FR_INVALID_DRIVE 驅(qū)動器號無效。 FR_EXIST 該文件已存在。 FR_DENIED 由于下列原因,所需的訪問被拒絕: 以寫模式打開一個只讀文件。 由于存在一個同名的只讀文件或目錄,而導(dǎo)致文件無法被創(chuàng)建。 由于目錄表或磁盤已滿,而導(dǎo)致文件無法被創(chuàng)建。 FR_NOT_READY 由于驅(qū)動器中沒有存儲介質(zhì)或任何其他原因,而導(dǎo)致磁盤驅(qū)動器無法工作。 FR_WRITE_PROTECTED 在存儲介質(zhì)被寫保護(hù)的情況下,以寫模式打開或創(chuàng)建文件對象。 FR_DISK_ERR 由于底層磁盤I/O接口函數(shù)中的一個錯誤,而導(dǎo)致該函數(shù)失敗。 FR_INT_ERR 由于一個錯誤的FAT結(jié)構(gòu)或一個內(nèi)部錯誤,而導(dǎo)致該函數(shù)失敗。 FR_NOT_ENABLED 邏輯驅(qū)動器沒有工作區(qū)。 FR_NO_FILESYSTEM 磁盤上沒有有效地FAT卷。 描述 如果函數(shù)成功,則創(chuàng)建一個文件對象。該文件對象被后續(xù)的讀/寫函數(shù)用來訪問文件。如果想要關(guān)閉一個打開的文件對象,則使用f_close函數(shù)。如果不關(guān)閉修改后的文件,那么文件可能會崩潰。 在使用任何文件函數(shù)之前,必須使用f_mount函數(shù)為驅(qū)動器注冊一個工作區(qū)。只有這樣,其他文件函數(shù)才能正常工作。 例子(文件拷貝) void main (void) { FATFS fs[2]; /* 邏輯驅(qū)動器的工作區(qū)(文件系統(tǒng)對象) */ FIL fsrc, fdst; /* 文件對象 */ BYTE buffer[4096]; /* 文件拷貝緩沖區(qū) */ FRESULT res; /* FatFs 函數(shù)公共結(jié)果代碼 */ UINT br, bw; /* 文件讀/寫字節(jié)計數(shù) */ /* 為邏輯驅(qū)動器注冊工作區(qū) */ f_mount(0, &fs[0]); f_mount(1, &fs[1]); /* 打開驅(qū)動器 1 上的源文件 */ res = f_open(&fsrc, "1:srcfile.dat", FA_OPEN_EXISTING | FA_READ); if (res) die(res); /* 在驅(qū)動器 0 上創(chuàng)建目標(biāo)文件 */ res = f_open(&fdst, "0:dstfile.dat", FA_CREATE_ALWAYS | FA_WRITE); if (res) die(res); /* 拷貝源文件到目標(biāo)文件 */ for (;;) { res = f_read(&fsrc, buffer, sizeof(buffer), &br); if (res || br == 0) break; /* 文件結(jié)束錯誤 */ res = f_write(&fdst, buffer, br, &bw); if (res || bw < br) break; /* 磁盤滿錯誤 */ } /* 關(guān)閉打開的文件 */ f_close(&fsrc); f_close(&fdst); /* 注銷工作區(qū)(在廢棄前) */ f_mount(0, NULL); f_mount(1, NULL); } |
|