Формат имени пути в модуле FatFs используется такие же, как и в спецификации имен DOS/Windows, и выглядят так:
"[drive#:][/]directory/file"
Модуль FatFs поддерживает длинные имена (LFN) и короткие имена формата 8.3 (SFN). LFN можно использовать, когда опция LFN включена (_USE_LFN > 0). Поддиректории разделяются символом-разделителем \ или / точно так же, как в API DOS/Windows. Задублированные разделители пропускаются и игнорируются. Различие только в том, что логический диск указывается в числовом виде, вместе с двоеточием. Когда номер диска пропущен, то подразумевается, что используется диск по умолчанию (0 или текущий диск).
Управляющие символы (от \0 до \x1F) распознаются как конец имени пути. Начальные/внутренние пробелы в имени пути допустимы в разрешенной конфигурации LFN, но они распознаются как окончание имени пути в конфигурации не-LFN. Завершающие пробелы и точки игнорируются.
В конфигурации по умолчанию (_FS_RPATH == 0) нет такого понятия, как текущая директория, как принято в операционных системах. Все объекты на томе указываются через полный путь, который начинается с корневой (root) директории. Имена директорий в виде точек (“.”, “..”) недопустимы. Начальный разделитель игнорируется, и может быть опущен, а может и присутствовать. Номер диска по умолчанию фиксирован и равен 0.
Когда относительные имена путей разрешены(_FS_RPATH == 1), указанные пути начинаются с корневой (root) директории, если в имени пути имеется начальный разделитель (в первом символе стоит ‘/’ или ‘\’). Если в первом символе пути разделителя нет, то путь начинается не от корневой, а от текущей директории, которая устанавливается вызовом функции f_chdir. Имена директорий в виде точек также допустимы в составе имени пути. Диском по умолчанию является текущий диск, который установлен вызовом функции f_chdrive. В таблице приведены примеры, как трактуется имя пути в зависимости от режима, установленного макросом _FS_RPATH.
Имя пути
|
_FS_RPATH == 0
|
_FS_RPATH == 1
|
file.txt
|
Файл в корневой (root) директории на диске 0
|
Файл в текущей директории на текущем диске
|
/file.txt
|
Файл в корневой (root) директории на диске 0
|
Файл в корневой (root) директории на текущем диске
|
|
Корневая (root) директория диска 0
|
Текущая директория текущего диска
|
/
|
Корневая директория диска 0
|
Корневая директория текущего диска
|
2:
|
Корневая директория диска 2
|
Текущая директория диска 2
|
2:/
|
Корневая директория диска 2
|
Корневая директория диска 2
|
2:file.txt
|
Файл в корневой директории диска 2
|
Файл в текущей директории диска 2
|
../file.txt
|
Недопустимое имя файла
|
Файл, находящийся в родительской директории
|
.
|
Недопустимое имя
|
Эта директория
|
..
|
Недопустимое имя
|
Родительская директория
|
dir1/..
|
Недопустимое имя
|
Текущая директория
|
/..
|
Недопустимое имя
|
Корневой каталог (прикреплен к верхнему уровню пути)
|
Unicode API
Имена путей на входе и выходе могут задаваться либо в кодировке ANSI/OEM (SBCS/DBCS), либо в кодировке Unicode, в зависимости от опций конфигурации. Тип аргументов, которые указывают имя файла, заданы как тип TCHAR, который в конфигурации по умолчанию является псевдонимом char. Кодировка строки имени файла является кодировкой ANSI/OEM, указанной макросом _CODE_PAGE. Когда макрос _LFN_UNICODE установлен в 1 (в режиме LFN), тип TCHAR переключается на unsigned short (символ UCS-2), который поддерживает Unicode. В этом случае опция LFN полностью поддерживается и символы, специфичные для Unicode, как ?????, могут также использоваться в составе имени пути. Эта установка также влияет на типы данных и кодирование строк в функциях ввода/вывода строк. Для определения литеральных строк имеются макросы _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); /* меняется автоматически */
Соответствие между логическими и физическими дисками
Модуль FatFs имеет рабочие области, которые называются file system object для каждого тома (логического диска). По умолчанию каждый логический диск привязан к физическому, который имеет тот же самый номер диска. В результате делается попытка примонтировать том в формате SFD на первом разделе FDISK. Когда в конфигурации включена установка _MULTI_PARTITION >= 1, то каждый отдельный логический диск привязан к любому физическому диску/разделу. В этом случае таблица управления томами должна быть задана пользователем. Она должна использоваться, чтобы отследить взаимосвязь между логическими дисками и разделами следующим образом.
/* Пример: Логический диск 0-2 назначен на три primary раздела на физическом драйве 0 (неизвлекаемый диск).
Логический диск 3 назначен физическому драйву 1 (извлекаемый disk). */
PARTITION VolToPart[] = {
{0, 1}, /* Logical drive 0 ==> физический диск 0, 1 раздел */
{0, 2}, /* Logical drive 1 ==> физический диск 0, 2 раздел */
{0, 3}, /* Logical drive 2 ==> физический диск 0, 3 раздел */
{1, 0} /* Logical drive 3 ==> физический диск 1 (автодетектирование) */
};
При использовании конфигурации
_MULTI_PARTITION нужно принять во внимание некоторые соображения:
- Могут быть примонтированы только 4 primary-раздела. Расширенные разделы (Extended partition) не поддерживаются.
- Физический диск, который имеет два или большее количество разделов, должен относиться к неизвлекаемому классу (non-removable class).