FatFsモジュールでのファイル、ディレクトリ、ドライブの指定方法はDOS/Windows APIとほぼ同じです。パス名のフォーマットは次の通りです。
"[論理ドライブ番号:][/]ディレクトリ名/ファイル名"
FatFsモジュールは長いファイル名(LFN)および8.3形式ファイル名(SFN)に対応しています。LFNは、(_USE_LFN > 0)のとき使用可能になります。ディレクトリ・セパレータにはDOS/Windows APIと同じく / と \ を使用します。連続したセパレータは無視され1個として扱われます。唯一の違いは、論理ドライブの指定だけです。論理ドライブ番号は、'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/.. | 無効 | カレント・ディレクトリ |
/.. | 無効 | ルート・ディレクトリ(その上は辿れない) |
ファイル関数の入出力のうちファイル名やパス名を指定する引数の型は、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で結びつけられていて、SFDとしてまたは第1区画のボリュームがマウントされます。_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, 自動検出 */ };
複数区画指定を使用する場合、次の点に注意しなければなりません。