- •Работа с файловой системой
- •Содержание
- •1. Цель работы
- •2. Порядок выполнения работы
- •3. Структура каталогов файловых систем fat и vfat
- •Структура элемента каталога fat в Windows
- •Структура элемента каталога с длинным именем
- •4. Работа с файловой системой
- •4.1. Создание, открытие, чтение и запись в файл
- •4.2. Поиск файлов в dos
- •4.3. Поиск файлов в Windows
- •4.4. Опрос и изменение свойств файлов
- •4.4.1. Атрибуты
- •4.4.2. Дата и время последней модификации
- •4.5. Перемещение и удаление файлов
- •4.6. Работа с каталогами
- •5. Работа с параметрами командной строки
- •6. Пример
- •Текст программы
- •Библиографический список
- •Поиск файлов по дереву каталогов
- •Варианты заданий
Структура элемента каталога fat в Windows
Смеще-ние |
Размер, байт |
Описание |
00h |
8 |
Имя файла. Все буквы заглавные. До 8 символов имя дополняется пробелами (код 20h). Первый символ имени (смещение 0) может иметь специальное значение: = 00h – элемент каталога никогда не использовался = E5h – файл удален = 2Eh (точка) – псевдоним каталога |
08h |
3 |
Расширение файла. Все буквы заглавные. До 3 символов дополняется пробелами. |
0Bh |
1 |
Атрибуты файла – комбинация битов: бит 0 – только чтение (readonly); бит 1 – скрытый (hidden); бит 2 – системный (system); бит 3 – метка тома (volume label); бит 4 – подкаталог (directory entry); бит 5 – архивный (archive). |
0Ch |
1 |
Используется в Windows NT: регистр символов в полях имени и расширения (верхний / нижний) |
0Dh |
1 |
Время создания, мсек |
0Eh |
2 |
Время создания в формате DOS: биты 0-4 – секунды, умноженные на 2 (0..30); биты 5-10 – минуты (0..59); биты 10-15 – часы (0..23) |
10h |
2 |
Дата создания в формате DOS: биты 0-4 – день (1..31); биты 5-8 – месяц (1..12); биты 9-15 – год от 1980 (0..119). |
12h |
2 |
Дата последнего обращения в формате DOS |
14h |
2 |
Старшее слово номера начального кластера в FAT32 |
16h |
2 |
Время последней модификации в формате DOS |
18h |
2 |
Дата последней модификации в формате DOS |
1Ah |
2 |
Младшее слово номера начального кластера |
1Ch |
4 |
Размер файла в байтах (максимальный размер 4 Гб). Для каталогов равен 0. |
В VFAT на каждый файл с длинным именем отводится несколько смежных 32-байтовых элементов каталога. В первых из них хранится длинное имя в кодировке Unicode (таблица 2), в последнем – короткое имя (алиас), атрибуты, длина файла и пр. в формате DOS (таблица 1).
Таблица 2
Структура элемента каталога с длинным именем
Смеще-ние |
Размер, байт |
Описание |
00h |
1 |
Порядковый номер. У последнего элемента к порядковому номеру прибавляется 40h |
01h |
10 |
Младшие 5 символов имени (2 байта на символ) |
0Bh |
1 |
Атрибуты (всегда равно 0Fh) |
0Ch |
1 |
Зарезервировано и равно 0 |
0Dh |
1 |
Контрольная сумма, которая вычисляется из алиаса 8.3 по правилу: i=1..11, на каждом шаге сумма циклически сдвигается вправо на один бит и суммируется с i-м символом короткого имени. Она одинакова для всех элементов, относящихся к одному файлу. |
0Eh |
12 |
Следующие 6 символов имени |
1Ah |
2 |
Номер начального кластера = 0 |
0Ch |
4 |
Старшие 2 символа имени |
Элементы каталога, содержащие длинное имя, нумеруются от 1 до N и хранятся в каталоге от последнего к первому: сначала располагается элемент номер N, с последними символами имени, а непосредственно перед алиасом лежит элемент номер 1 с первыми символами имени.
Программы DOS корректно работают с элементами каталога, содержащими короткие имена, и «не видят» элементы каталога с описаниями длинных имен по двум причинам. Во-первых, поле атрибутов равно 0Fh, что соответствует установленным атрибутам «только для чтения», «скрытый», «системный», «метка тома», а большинство ПО игнорирует описания файлов с атрибутом «метка тома». Во-вторых, поле «номер начального кластера» устанавливается в ноль, запрещенную величину для файлов DOS.
Все описанные ниже функции для работы с файловой системой вызываются через прерывание INT 21h. Если операция завершилась успешно, возвращается CF=0, при ошибке CF=1.
Функции LFN не поддерживаются в старых версиях DOS и Windows NT: после вызова AX=7100h, и флаг CF не изменяется. Рекомендуется перед вызовом функций LFN устанавливать CF=1. Тогда, если LFN не поддерживается, будет возвращен признак ошибки.
Е