Начиная с Windows 95 была введена практика использования “длинных” имён для каталогов и файлов. В таких именах допускается использование символов разного регистра, наличие точек, пробелов и некоторых других специальных символов.
В каталоге под такой файл отводится несколько смежных 32-байтных блоков.
Эти элементы имеют спецефическое значение элемента “атрибуты”, выставлены одновременно флаги “метка тома”, “системный”, “скрытый” и “только чтение”, благодаря которому ОС их не воспринимает при поиске и не отображает. После этих записей идет элемент с обычной структурой, в котором хранится короткое имя в формате 8.3. Этот элемент заключает в себе номер начального кластера, дату создания и атрибуты файла или каталога.
Важно понимать, что длинное имя без короткого не существует.
Все блоки с частями длинного имени нумеруются по порядку следования символов, причем блок с номером 01h
будет располагаться непосредственно перед блоком с коротким именем.
Если в этот 01h
-ый блок не умещается длинное имя, то перед ним будет блок с номером 02h
и так далее, до тех пор, пока имя не уместится.
У самого последнего блока номер будет увеличиваться на 40h
. То есть если длинное имя заключилось в 1 блок, то его номер будет 41h
.
Итак, резюмирую. Структура файлов с “длинным” именем выглядит так:
Смещение | Длина в байтах | Описание |
00h | 1 | Порядковый номер блока |
01h | 10 | Имя (5 символов Unicode по 2 байта каждый) |
0Bh | 1 | Атрибуты 0Fh |
0Ch | 1 | Тип (00h ) |
0Dh | 1 | Контрольный код (берется из короткого имени) |
0Eh | 12 | Имя (6 символов Unicode по 2 байта каждый) |
1Ah | 2 | Байты 0000h |
1Ch | 4 | Имя (2 символа Unicode по 2 байта каждый) |
Нетрудно подсчитать, что одна такая запись позволяет вместить 5+6+2=13 символов имени файла.
Создадим на флешке файл с именем “long_name_file_ole-ole-raz-dva-tri-raz-dva-tri-raz-dva-tri.txt”, это 62 символа. 62 делим на 13 получаем 5 (с округлением в большую сторону), значит, чтобы описать такое имя, потребуется 5 блоков для длинного имени + 1 блок для короткого.

- Байт 01h – первый блок длинного имени;
- Байт 02h – второй блок длинного имени. Мы знаем, что имя не вместится в этот блок, поскольку последний блок увеличивается на 40h;
- Аналогично;
- Аналогично;
- Байт 45h – пятый блок имени, он увеличен на 40h (40h + 05h = 45h), значит блок последний;
- Сразу после 01h блока идёт блок с описанием короткого имени файла, его мы рассматривали ранее (см. записи по тегу FAT)
- Вот тут начинается длинное имя. Так как это Unicode, то под каждый символ отводится 2 байта. Выписываем эти символы (чуть ниже);
- Эта вставка из таблицы, атрибуты и тип;
- Аналогично, табличное;
Итак, начинаем вычитывать имя файла. Выписываем байты с 01h блока по последний. Всё, что я отметил зеленым в первом блоке, перепишем последовательно:
6C 6F 6E 67 5F 6E 61 6D 65 5F 66 69 6C
Теперь переходим на следующий блок (вверх) и продолжаем:
65 5F 6F 6C 65 2D 6F 6C 65 2D 72 61 7A
Продолжаем 3-ий блок:
2D 64 76 61 2D 74 72 69 2D 72 61 7A 2D
Продолжаем 4-ый блок:
64 76 61 2D 74 72 69 2D 72 61 7A 2D 64
Наконец 5-ый блок:
76 61 2D 74 72 69 2E 74 78 74 00
Склеив это, получаем:
6C 6F 6E 67 5F 6E 61 6D 65 5F 66 69 6C 65 5F 6F 6C 65 2D 6F 6C 65 2D 72 61 7A 2D 64 76 61 2D 74 72 69 2D 72 61 7A 2D 64 76 61 2D 74 72 69 2D 72 61 7A 2D 64 76 61 2D 74 72 69 2E 74 78 74 00
Переводим в текст:

Вот так и хранятся длинные имена файлов. Спасибо за внимание!
Интересно прочитать про то, как файловая система сохраняет длинные имена. А как быть с NTFS? Расскажите о ней!