# パス名のフォーマット

### ファイル・ディレクトリ名

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

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

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

ヌル文字と制御文字(`'\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_UNICODE == 1`)にしたときは、`TCHAR`はワイド文字(`WCHAR, 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で結びつけられていて、自動検出機能によりその物理ドライブ上の一つのFATボリュームがマウントされます。FATボリュームの検出は、セクタ0、第一区画、第二区画、第三区画、第四区画の順に行われます。

`_MULTI_PARTITION`に1を指定すると、それぞれの論理ドライブに対して個別に物理ドライブ番号と区画を指定できるようになります。この構成では、論理ドライブと区画の対応を解決するためのテーブルを次に示すように定義する必要があります。

    例:論理ドライブ0～2を物理ドライブ0(非リムーバブル)の3つの基本区画に割り当て、
       論理ドライブ3を物理ドライブ1(リムーバブル)に割り当てる場合。

    PARTITION VolToPart[] = {
        {0, 1},     /* 論理ドライブ 0 ==> 物理ドライブ 0, 第1区画 */
        {0, 2},     /* 論理ドライブ 1 ==> 物理ドライブ 0, 第2区画 */
        {0, 3},     /* 論理ドライブ 2 ==> 物理ドライブ 0, 第3区画 */
        {1, 0}      /* 論理ドライブ 3 ==> 物理ドライブ 1, 自動検出 */
    };

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

- マウント可能な区画は基本区画のみで、拡張区画内には対応しない。
- 複数の区画を持つ物理ドライブは、非リムーバブルでなければならない。