## ファイル・ディレクトリの指定方法

FatFsモジュールでのファイル、ディレクトリ、ドライブの指定方法はDOS/Windowsとほぼ同じです。パス名のフォーマットは次の通りです。

`"[論理ドライブ番号:][/]ディレクトリ名/ファイル名"`

FatFsモジュールは長いファイル名(LFN)および8.3形式ファイル名(SFN)に対応しています。LFNは、`(_USE_LFN > 0)`のとき使用可能になります。DOS/Windowsとの違いは、ディレクトリ・セパレータと論理ドライブ番号の指定です。ディレクトリ・セパレータには / または \ を使用します。論理ドライブ番号は、'0'～'9'の一文字の数字とコロンで指定し、省略した場合はデフォルト・ドライブ(0またはカレント・ドライブ)が選択されます。

Nul文字と制御文字(\0～\x1F)は、パス名の終端として認識されます。パス名に先行あるいは中に含まれるスペースは、LFN構成では名前の一部として有効ですが、非LFN構成ではパス名の終端として認識されます。

標準構成`(_FS_RPATH == 0)`のときは、全てのオブジェクトがルート・ディレクトリから辿る絶対パスで指定されます。OS指向なカレント・ディレクトリという概念は無く、またドット・ディレクトリ("."や"..")は使用できません。パス名先頭のセパレータは無視されます。デフォルト・ドライブ番号は常に0になります。

相対パスを有効`(_FS_RPATH == 1)`にしたときは、先行するセパレータの有無によって検索開始ディレクトリが変わり、セパレータがある場合はルート・ディレクトリから、無い場合はf_chdir関数で設定されるカレント・ディレクトリからになります。またパス名にドット・ディレクトリが使用できます。デフォルト・ドライブ番号はf_chdrive関数で設定された値となります。

パス名 | _FS_RPATH == 0 | _FS_RPATH == 1
file.txt | ドライブ0のルート・ディレクトリ下のファイル | カレント・ドライブのカレント・ディレクトリ下のファイル
/file.txt | ドライブ0のルート・ディレクトリ下のファイル | カレント・ドライブのルート・ディレクトリ下のファイル
| ドライブ0のルート・ディレクトリ | カレント・ドライブのカレント・ディレクトリ
2: | ドライブ2のルート・ディレクトリ | ドライブ2のカレント・ディレクトリ
2:file1.txt | ドライブ2のルート・ディレクトリ下のファイル | ドライブ2のカレント・ディレクトリ下のファイル
2:/ | ドライブ2のルート・ディレクトリ | ドライブ2のルート・ディレクトリ
../file.txt | 無効 | 親ディレクトリ下のファイル
. | 無効 | このディレクトリ
.. | 無効 | カレント・ディレクトリの親ディレクトリ
dir1/.. | 無効 | カレント・ディレクトリ
/.. | 無効 | ルート・ディレクトリ(その上は辿れない)

## Unicode API

ファイル関数の入出力のうちファイル名やパス名を指定する引数の型は、`TCHAR`で定義されていますが、これは`char`のエリアスになっています。そして、`_CODE_PAGE`で指定される ANSI/OEMコード(SBCSまたはDBCS)の文字列として扱われます。ファイル名入出力をUnicodeとする構成(LFN構成で、かつ`_LFN_UNICODE`を 1)にしたときは、`TCHAR`はワイド文字(`unsigned short`)に切り替わり、パス名にUnicodeを使用するようになります。これにより LFNフル対応となり、ANSI/OEMコードにない文字(たとえば ✝☪✡☸☭など)も使用できます。この設定は文字列入出力関数のデータ型とエンコーディングにも影響を与えます。リテラル文字列を定義するとき、次に示すように`_T(s)`および`_TEXT(s)`マクロを使ってANSI/OEMとUnicodeを自動切り替えすることができます。

     f_open(fp, "filename.txt", FA_READ);      /* ANSI/OEM専用コード */
     f_open(fp, L"filename.txt", FA_READ);     /* Unicode専用コード */
     f_open(fp, _T("filename.txt"), FA_READ);  /* 両用コード */

## 論理ドライブ(ボリューム)と物理ドライブ(ディスク装置)の対応

デフォルトの構成では、それぞれの論理ドライブは同じ番号の物理ドライブに1:1で結びつけられていて、物理ドライブの先頭の区画にあるボリュームがマウントされます。`_MULTI_PARTITION`に 1を指定すると、個々の論理ドライブに対して個別に物理ドライブ番号・区画を指定できるようになります。この構成では、論理ドライブと区画の対応を解決するためのテーブルを次に示すように定義する必要があります。

    例:論理ドライブ0～2を物理ドライブ0(固定ディスク)の3つの基本区画に割り当て、

       論理ドライブ3を物理ドライブ1(リムーバブル・ディスク)に割り当てる場合。

    const PARTITION Drives[] = {
        {0, 0},     /* Logical drive 0 ==> Physical drive 0, 1st partition */
        {0, 1},     /* Logical drive 1 ==> Physical drive 0, 2nd partition */
        {0, 2},     /* Logical drive 2 ==> Physical drive 0, 3rd partition */
        {1, 0}      /* Logical drive 3 ==> Physical drive 1 */
    };

複数区画指定を使用する場合、次の点に注意しなければなりません。

- 指定可能な区画は基本区画(0～3)のみ。
- 物理ドライブがSFD形式(区画テーブル無し)の場合、区画指定は無視される。
- 複数の論理ドライブを持つ物理ドライブは、固定ディスクでなければならない。