# パス名のフォーマット

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

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/.. | 無効 | カレント ディレクトリ
/.. | 無効 | ルート ディレクトリ(その上は辿れない)

また、`_STR_VOLUME_ID`オプションを有効にすることでドライブ番号の識別には数字のほか、`"sd:file1.txt"`や`"ram:swapfile.dat"`のように、任意の文字列を使用することも可能になります。

### 使用可能な文字と大文字小文字の識別

FATファイル システムでファイル名に使用可能な文字は、`0～9 A～Z ! # $ % & ' ( ) - @ ^ _ ` { } ~`および拡張文字(`\x80`～`\xFF`)となっています。LFN拡張ではこれらに加え、`+ , ; = [ ]`およびスペースが使用可能になり、スペースとピリオドはファイル名の末尾を除く任意の位置に挿入できます。

FATファイル システムでは、パス名についてケース インセンシティブです。たとえば、`file.txt, File.Txt, FILE.TXT`の3つの名前は同じ物として扱われます。これは、ASCII文字だけでなく拡張文字についても適用されます。ファイルが作成される際、SFNエントリには全て大文字に変換された名前が記録されます。LFN対応システムでは、LFNエントリには大文字変換されない名前が記録されます。

古い日本語MS-DOSでは拡張文字(いわゆる全角文字)についてはケース センシティブでした。FatFsモジュールではこれにしたがい、非LFN構成で文字コードにDBCSが選択されたときに限り、拡張文字に対して大文字変換を行わずにSFNエントリに記録および検索されます(日本語MSDOS仕様)。LFN構成では拡張文字についても大文字変換を行います(WindowsNT仕様)。このため、非LFN構成で全角小文字を含む名前でファイルを作成すると、Windowsでそのファイルを開けなくなるなどの互換性問題を起こすので、それらのシステムで相互利用するボリューム上ではDBCS拡張文字の使用は避けるべきです。

### 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, 自動検出 */
    };

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

- 複数のマウントされた区画を持つ物理ドライブは、非リムーバブルでなければならず、システム動作中のメディア交換は禁止。
- 基本区画のみマウント可能で、拡張区画内の区画には対応しない。
- Windowsは、リムーバブル ドライブでは複数区画をサポートせず、先頭区画のみ認識する。

戻る