Библиотека FatFS: Path Names, система именования файлов и директорий Печать
Добавил(а) microsin   

Имена путей (Path Names), формат имен путей

Формат имени пути в модуле 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).

[Ссылки]

1. Path Names (оригинал статьи на английском языке).