FatFs - f_mkfs

## f_mkfs

論理ドライブ上にFAT/exFATボリュームを作成(フォーマット)します。

    FRESULT f_mkfs (
      const TCHAR* path,  /* [IN] 論理ドライブ番号 */
      BYTE  opt,          /* [IN] フォーマット オプション */
      DWORD au,           /* [IN] クラスタ サイズ */
      void* work,         /* [-]  ワーク エリア */
      UINT len            /* [IN] ワーク エリアのサイズ */
    );

#### 引数

path
  フォーマット対象の論理ドライブを示すパス名を示すヌル文字`'\0'`終端の文字列へのポインタを指定します。ドライブ番号を含まない場合は、デフォルト ドライブを意味します。論理ドライブには`f_mount`関数でワークエリアが与えられている必要はありません。
opt
  フォーマット オプション。`FM_FAT, FM_FAT32, FM_EXFAT`の各フラグの組み合わせ(`FM_ANY`は、これらのOR値)で作成するFATボリュームのタイプを指定します。複数のタイプが指定された場合、その中のいずれかが自動選択されます。exFATが無効のときは、`FM_EXFAT`は無視されます。`FM_SFD`フラグを指定すると、SFD形式(後述)でボリュームを配置します。
au
  クラスタ サイズをバイト単位で指定します。有効値は、セクタ サイズのN倍となります。Nは2の累乗で、FAT/FAT32ボリュームでは1～128、exFATボリュームでは1～32768です。0を指定した場合は、ボリュームのサイズと選択されたFATタイプに応じたデフォルトのクラスタ サイズが選択されます。
work
  ワークエリアへのポインタを指定します。
len
  ワークエリアのサイズをバイト単位で指定します。ワークエリアのサイズは少なくとも関連するドライブのセクタサイズは必要です。また、十分に大きなサイズを与えることにより、書き込みトランザクションの回数が減ってフォーマット時間を短縮できます。

#### 戻り値

FR_OK, FR_DISK_ERR, FR_NOT_READY, FR_MKFS_ABORTED, FR_INVALID_PARAMETER

#### 説明

exFAT以外のボリュームのFATタイプ(FAT12/FAT16/FAT32)は、そのボリューム上のクラスタ数によってのみ決定される決まり[FAT仕様書より]になっていて、それ以外の要因はありません。したがって、どのFATタイプになるかはボリューム サイズとクラスタ サイズに依存します。そのボリュームのサイズにおいて、指定されたFATタイプとクラスタ サイズの組み合わせが成立し得ないときは、関数は`FR_MKFS_ABORTED`で失敗します。

クラスタとは、データ格納領域の管理の単位のことで、これを単位にファイルにデータ領域が割り当てられます。たとえば、クラスタ サイズが32768のときは、100バイトのファイルも32768バイトのスペースを消費することになります。このように、クラスタ サイズを大きくするほどボリュームの利用効率が悪くなりますが、その一方で読み書きの性能は上がります。クラスタ サイズによる利用効率と性能はトレード オフの関係にあります。GBクラスのストレージでは、極端に多くのファイルを扱わない限り32768バイト以上に(デフォルト指定ではそのようになる)しておくとよいでしょう。

パーテーション形式には、FDISK形式とSFD形式の二通りあります。FDISK形式は、ハードディスク、マルチメディアカード、SDカード、CFカード、USBメモリなどで標準的に使用されます。FDISK形式では一台の物理ドライブ上に一つまたは複数の区画を作成することができ、区画管理情報はMBR(物理ドライブの先頭セクタ)に記録されます。SFD形式は単に何の分割も行わない形式で、ボリュームは物理ドライブの先頭セクタから開始します。SFD形式は、フロッピー ディスク、マイクロドライブ、光学ディスク、およびその他スーパー フロッピー メディアで標準的に使用されています。システムによっては、FDISK形式またはSFD形式のどちらか一方のみをサポートし他方をサポートしません。

`FM_SFD`が指定されないときはFDISK形式となり、その物理ドライブ全体を占める1個の基本区画(パーテーション)が作成され、その中にFATボリュームが作成されます。`FM_SFD`が指定されたときはSFD形式となり、FATボリュームがその物理ドライブの先頭セクタからベタで作成されます。

マルチ パーテーション機能(`_MULTI_PARTITION`)により、その論理ドライブが特定の区画(1～4)に結び付けられている場合は、その区画の中にFATボリュームが作成されます。`FM_SFD`の指定は無視され、その物理ドライブはこれに先立ち、`f_fdisk`関数または他のツールで適切に区画設定されている必要があります。

#### 対応情報

`_FS_READONLY == 0`で、且つ`_USE_MKFS == 1`のとき使用可能です。

#### 使用例

    /* Format default drive and create a file */
    int main (void)
    {
        FATFS fs;           /* File system object */
        FIL fil;            /* File object */
        FRESULT res;        /* API result code */
        UINT bw;            /* Bytes written */
        BYTE work[_MAX_SS]; /* Work area (larger is better for process time) */

        /* Create FAT volume */
        res = f_mkfs("", FM_ANY, 0, work, sizeof work);
        if (res) ...

        /* Register work area */
        f_mount(&fs, "", 0);

        /* Create a file as new */
        res = f_open(&fil, "hello.txt", FA_CREATE_NEW | FA_WRITE);
        if (res) ...

        /* Write a message */
        f_write(&fil, "Hello, World!\r\n", 15, &bw);
        if (bw != 15) ...

        /* Close the file */
        f_close(&fil);

        ...

#### 参照

ボリューム サイズとフォーマット パラメータ, ボリューム管理, `f_fdisk`

戻る