ファイルをオープンまたは作成します。
FRESULT f_open ( FIL* FileObject, /* 空のファイル・オブジェクト構造体へのポインタ */ const TCHAR* FileName, /* ファイルのフルパス名へのポインタ */ BYTE ModeFlags /* モードフラグ */ );
| 値 | 意味 |
|---|---|
| FA_READ | 読み出しモードで開きます。読み書きする場合はFA_WRITEと共に指定します。 |
| FA_WRITE | 書き込みモードで開きます。読み書きする場合はFA_READと共に指定します。 |
| FA_OPEN_EXISTING | 既存のファイルを開きます。ファイルが無いときはエラーになります。(デフォルト) |
| FA_OPEN_ALWAYS | 既存のファイルを開きます。ファイルが無いときはファイルを作成します。追記の場合は、この方法でオープンした後、f_lseek()でファイルの最後尾に移動してください。 |
| FA_CREATE_NEW | ファイルを作成します。同名のファイルがある場合は、FR_EXISTで失敗します。 |
| FA_CREATE_ALWAYS | ファイルを作成します。同名のファイルがある場合は、サイズを0にしてから開きます。 |
FR_OK, FR_DISK_ERR, FR_INT_ERR, FR_NOT_READY, FR_NO_FILE, FR_NO_PATH, FR_INVALID_NAME, FR_DENIED, FR_EXIST, FR_WRITE_PROTECTED, FR_INVALID_DRIVE, FR_NOT_ENABLED, FR_NO_FILESYSTEM, FR_TIMEOUT, FR_LOCKED, FR_NOT_ENOUGH_CORE, FR_TOO_MANY_OPEN_FILES
既存のファイルを開いたり、新しいファイルを作成します。関数が成功するとファイル・オブジェクトが作成され、以降そのファイルに対するアクセスに使用します。ファイルを閉じるときは、f_close()を使用します。何らかの変更が行われたファイルがその後正しく閉じられなかった場合、そのファイルが破損する場合があります。
もしも既に開かれているファイルを開く必要がある場合は、多重アクセス制御を参照してください。
ファイル・アクセスを開始する前に、f_mount()を使ってそれぞれの論理ドライブにワーク・エリア(ファイル・システム・オブジェクト)を与える必要があります。この初期化の後、その論理ドライブに対して全てのファイル関数が使えるようになります。
全ての構成で使用可能です。_FS_READONLY == 1のときは、FA_WRITE, FA_CREATE_ALWAYS, FA_CREATE_NEW, FA_OPEN_ALWAYSの各フラグはサポートされません。
void main (void)
{
FATFS fs[2]; /* 論理ドライブのワーク・エリア(ファイル・システム・オブジェクト) */
FIL fsrc, fdst; /* ファイル・オブジェクト */
BYTE buffer[4096]; /* file copy buffer */
FRESULT res; /* FatFs function common result code */
UINT br, bw; /* File R/W count */
/* ドライブ0,1にワーク・エリアを与える (常に成功する) */
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);
}