Краткие теоретические сведения
Данные на внешних носителях принято организовывать в виде файлов.
Файл — упорядоченный набор данных, пригодный для использования прикладными программами. Удобно представлять файл как совокупность данных (используются прикладными программами) и метаданных (данные о размещении данных, используются системными программами).
Для организации хранения данных, предоставления доступа к ним и обеспечения другого сервиса служит файловая система (ФС). В это понятие входят как структуры для собственно хранения данных и метаданных, так и включенные в ПО средства работы с ними.
Типичной для файловых систем является иерархическое (древовидное) построение: файлы могут объединяются в каталоги (директорий — directory, папка — folder), причем сами каталоги также могут быть вложенными. Таким образом, каталог также файла, но специального вида — предназначенным для хранения информации о включенных в него файлах и других каталогах.
Помимо каталогов, предусматриваются и другие виды специальных файлов: файлы логических устройств, файлы-ссылки, файлы – метки тома и т.д. В отличие от специальных типов объектов файловой системы «обычные» файлы программ или данных называют регулярными.
Файлы принято идентифицировать их именами. Учитывая наличие каталогов и подкаталогов, для однозначной локализации файла требуется также и путь к нему (path) — перечисление всей цепочки каталогов.
Для ФС Microsoft характерна отдельная иерархия каталогов для каждого логического диска. Логический диск может соответствовать физическому накопителю или одному из его разделов, реже — виртуальному устройству. С точки зрения системы каждый логический диск рассматривается как самостоятельное устройство и идентифицируется буквой: A, B, C и т.д.
Таким образом, полный (абсолютный) путь к файлу будет начинаться от «буквы» логического диска, например: A:\directory1\directory2\...\file.ext. Относительный путь начинается от текущего каталога в файловой системе.
Традиционными для MS-DOS и ранних версий Windows были файловые системы FAT (более подробно см. описание следующей лабораторной работы). Первоначально имена ограничивались 8 символами собственно «имени» и 3 символами «расширения» (extention), причем набор символов ограничивался латинскими буквами, цифрами и некоторыми дополнительными символами: +, –, _ и т.д. Позже в именах были допущены символы национальных алфавитов, а затем введены и «длинные» имена, причем уже с использованием Unicode. Пределом длины «длинного» имени указывается 255 символов, а имени вместе с путём — 260 символов.
Традиционные имена «8.3» содержат буквы только в верхнем регистре, и приведение их выполняется автоматически, поэтому для пользователя имена не чувствительны к регистру букв. «Длинные» имена хранятся с учётом регистра букв, однако их сравнения всё равно регистронечувствительны. Поэтому имена будут соответствовать своим файлам независимо от регистра букв в них, а в одном каталоге не могут быть два файла, имена которых различаются только регистром букв.
Для доступа к файлу он должен быть предварительно открыт, все последующие действия будут выполняться над системным объектом «открытый файл». Первоначально в MS-DOS применялись FCB (File Control Block) — структуры, содержащие информацию о файле и выполняемой над ним операции, в ту же структуру могли заноситься и результаты операции. Позже был введен более удобный подход, основанный на использовании файловых дескрипторов (file descriptor). Дескриптор представляет собой целое число, получаемое после открытия или создания файла и однозначно идентифицирующее его. Полученный дескриптор действует до закрытия файла. Вся служебная информация об объекте остается скрытой от прикладной программы, что упрощает работу. В результате FCB-ориентированные функции признаются устаревшими и поддерживаются в основном для совместимости с ранее написанным ПО, а основным методом доступа в современных ОС является дескрипторный.
Сервис MS-DOS для работы с файлами представлен рядом функций прерывания 21h. Ниже перечислены некоторые из них (дескрипторный доступ).
AH=3Ch — создание файла с усечением содержимого;
AH=3Dh —открытие существующего файла;
AH=5Bh — создание файла (если не существует) или открытие;
AX=6C00h — создание или открытие файла с выбором поведения функции с посредством дополнительных флагов;
AX=716Ch — то же с поддержкой длинных имён;
AH=42h — позиционирование в файле;
AH=3Fh — чтение из файла в буфер в памяти;
AH=40h — запись данных из буфера в файл;
AH=3Eh — закрытие файла.
Имеются также функции, работающие с объектами файловой системы, без открытия файлов. Некоторые из них перечислены ниже.
AH=43h — получение или установка атрибутов файла (имеет подфункции);
AH=56h — переименование файла;
AX=7156h — переименование с поддержкой длинных имён;
AH=57h — получение или установка даты и времени для файла;
AH=41h — удаление файла;
AH=39h и 3Ah — создание и удаление каталога;
AX=7139h и 713Ah — то же с поддержкой длинных имён;
AH=47h и 3Bh — получение и установка текущего каталога;
AX=7147h и 713Bh — то же с поддержкой длинных имён;
AH=4Eh и 4Fh — поиск (начало и продолжение поиска) файла по шаблону, результат возвращается в области DTA;
AX=714Eh и 714Fh — поиск с поддержкой длинных имён;
Контрольные вопросы
1) Хранение файлов и организация доступа к ним.
2) Способы доступа к файлам.
3) Атрибуты файлов.
4) Функции MS-DOS для работы с файлами.
5) Открытие и закрытие файлов.
6) Чтение данных из файла.
7) Запись данных в файл.
8) Поиск файла.
9) Создание файлов.
10) Переименование файлов.
11) Удаление файлов.
Варианты заданий
1. С клавиатуры вводятся имя исходного файла и имя файла для хранения результата. Необходимо при помощи функции поиска файлов убедиться в существовании исходного файла и отсутствии результирующего. Если исходный файл отсутствует, выдается предупреждение, и выполнение останавливается. Если результирующий файл уже присутствует, выдается предупреждение, и прежнее содержимое файла перекрывается.
После проверки необходимо открыть исходный файл, прочитать его блоками по 256 байт, зашифровать при помощи своей фамилии и зашифрованные данные сохранить в результирующий файл. Для шифрования использовать функцию XOR для соответствующих байтов фамилии и данных
2. С клавиатуры вводятся первые символы имени файла (например, myfile) и имя файла результата. Необходимо найти все файлы, начинающиеся с данных символов (myfile.txt, myfile1.doc, myfile005.txt, …), по очереди открыть эти файлы и склеить их содержимое в результирующем файле, читая блоками по 256 байт.
3. С клавиатуры вводится расширение имени для поиска файлов (например, txt) и имя файла результата. Необходимо найти все файлы с этим расширением и сохранить их имена в результирующем файле. В случае, если файл для хранения результата уже существует, его старое содержимое должно быть сохранено, а новые записи надо добавлять в конец файла.
4(повышенной сложности). Репозиторий имен файлов и директориев.
Репозиторий представляет собой динамическую структуру в памяти (предположительно дерево или иерархический список), содержащую информацию об именах файлов и каталогах, принадлежности файлов каталогам, вложенности каталогов. Поддерживаются «длинные» имена.
Для репозитория должны быть реализованы функции: включение файла (каталога) в репозиторий; исключение файла (каталога); форматированный вывод содержимого репозитория; сравнение содержимого репозитория и файловой системы.
В качестве дополнительной функции можно предусмотреть частичную выгрузку содержимого репозитория в файл.
Данное задание требует знакомства со средствами управления памятью.
Лабораторная работа 2:
Файловая система FAT