КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ. Уже в MSDOS 2.0, вместе с усовершенствованием FAT (например, появлением вложенных директорий), появился набор UNIX-подобных функций работы с файлами
Уже в MSDOS 2.0, вместе с усовершенствованием FAT (например, появлением вложенных директорий), появился набор UNIX-подобных функций работы с файлами, использующих для описания файла всего одно 16-битное число, идентификатор файла или устройства. Все остальные функции работы с файлами используют затем только это число. Первые пять идентификаторов инициализируются системой следующим образом: 0: STDIN - стандартное устройство ввода (обычно клавиатура); 1: STDOUT - стандартное устройство вывода (обычно экран); 2: STDERR - устройство вывода сообщений об ошибках (всегда экран); 3: AUX- последовательный порт (обычно СОМ1); 4: PRN- параллельный порт (обычно LPT1); так что функции чтения/записи (а также сброс буферов на диск) файлов можно применять и к устройствам. Создание и открытие файлов Функция DOS3Ch: Создать файл Вход: AH-3Ch СХ - атрибут файла DS: DX - адрес ASCIZ-строки с полным именем файла (ASCIZ-строка ASGII-символов, оканчивающаяся нулем) Выход: CF - 0 и АХ - идентификатор файла, если не произошла ошибка CF -> 1 и АХ - 03h, если путь не найден CF - 1 и АХ - 04h, если слишком много открытых файлов CF - 1 и АХ - 05h, если доступ запрещен Если файл уже существует, функция 3Ch все равно открывает его, присваивая ему нулевую длину. Чтобы этого не произошло, следует пользоваться функцией 5Bh. Функция DOS 3Dh: Открыть существующий файл Вход: АН - 3Dh AL - режим доступа ' DS: DX = адрес ASCIZ-строки с полным именем файла CL = маска атрибутов файлов Выход: CF- 0 и АХ «идентификатор файла, если не произошла ошибка CF = 1 и АХ = код ошибки (02h - файл не найден, 03h - путь не найден, 04h - слишком много открытых файлов, 05h - доступ запрещен, 0Ch - неправильный режим доступа) Функция DOS 5Bh: Создать и открыть новый файл Вход: АН = 5ВЬ СХ = атрибут файла DS: DX ~" адрес ASCIZ-строки с полным именем файла Выход: CF = 0 р АХ = идентификатор файла, открытого для чтения/записи в режиме совместимости, если не произошла ошибка CF = 1 и АХ = код ошибки (ОЗЬ - путь не найден, 04h - слишком много открытых файлов, 05Ь - доступ запрещен, 50Ь - файл уже существует) Функция DOS 5Ah: Создать и открыть временный файл Вход: АН - 5АЬ СХ = атрибут файла /DS.DX «адрес ASCIZ-строки с путем, оканчивающимся символом \, и тринадцатью нулевыми байтами в конце Выход: CF = 0 и АХ - идентификатор файла, открытого для чтения/записи в режиме совместимости, если не произошла ошибка (в строку по адресу DS: DX дописывается имя файла) CF =1 и АХ - код ошибки (03h - путь не найден, 04h - слишком много открытых файлов, 05h - доступ запрещен) filespec db.'c: \data\filename.ext\0 причем, если диск или путь опущены, используются их текущие значения. Для работы с длинными именами файлов в DOS 7.0 (Windows 95) и старше используются дополнительные функции, которые вызываются так же, как функция DOS 71Ь. Функция LFN6Ch: Создать или открыть файл с длинным именем Вход: АХ - 716Ch СХ = атрибут файла DX - действие DS: SI = адрес ASCIZ-строки с именем файла DI = число, которое будет записано в конце короткого варианта имени файла Выход: CF == 0 АХ - идентификатор файла СХ = 1, если файл открыт СХ = 2, если файл создан СХ = 3, если файл заменен CF - 1, если произошла ошибка АХ = код ошибки (7100h, если функция не поддерживается) Если функции открытия файлов возвращают ошибку «слишком много открытых файлов» (АХ - 4), следует увеличить число допустимых идентификаторов с помощью функции 67h. Функция DOS 67h: Изменить максимальное число идентификаторов файлов Вход: АН - 67h ВХ - новое максимальное число идентификаторов (20-65 535) Выход: CF - 0, если не произошла ошибка CF - 1 и АХ - код ошибки, если Произошла ошибка (например: 04h, если заданное число меньше, чем количество уже открытых файлов, или 08h; если DOS не хватает памяти для новой таблицы идентификаторов) Следует помнить, что все дочерние процессы будут наследовать только первые 20 идентификаторов и должны вызывать функцию 67h сами, если им требуется больше. Чтениеи запись в файл Функция DOS 3Fh: Чтение из файла или устройства Вход: АН = 3Fh ВХ - идентификатор СХ - число байтов DS.DX * адрес буфера для приема данных Выход: CF - 0 и АХ - число считанных байтов, если не было ошибки CF = 1 и АХ = 05h, если доступ запрещен, 06h, если неправильный идентификатор. Если при чтении из файла число фактически считанных байтов в АХ меньше, чем заказанное число в СХ, то был достигнут конец файла. Каждая следующая операция чтения, так же как и записи, начинается не с начала файла, а с того байта, на котором остановилась предыдущая операция чтения/записи. Если требуется считать (или записать) произвольный участок файла, использует функцию 42h (функция lseek в С). Функция DOS 42h: Переместить указатель чтения/записи Вход: АН-42h ВХ = идентификатор CX: DX - расстояние, на которое надо переместить указатель (со знаком) AL - перемещение: Выход: CF = 0 и CX: DX - новое значение указателя (в байтах от начала файла), если не произошла ошибка CF = 1 и АХ = 06h, если неправильный идентификатор Указатель можно установить за реальными пределами файла: в отрицательное число, тогда следующая операция чтения/записи вызовет ошибку; в положительное число, большее длины файла, тогда очередная операция записи увеличит размер файла. Эта функция также часто используется для определения длины файла - достаточно вызвать ее с СХ = 0, DX = 0, AL = 2, и в CX: DX будет возвращена длина файла в байтах. Функция DOS 40k Запись в файл или устройство Вход: АН = 40h ВХ - идентификатор СХ - число байтов DS: DX - адрес буфера с данными Выход: CF - 0 и АХ - число записанных байтов, если не произошла ошибка CF - 1 и АХ05h; если доступ запрещай; 06h, если неправильный идентификатор Если при записи; в файл указать СХ - 0, он будет обрезан по текущему значению указателя. На самом деле происходит запись в буфер DOS, данные из которого сбрасываются на диск во время закрытия файла или если их количество превышает размер сектора диска. Для немедленной очистки буфера можно использовать функцию 68h (функция fflush в С). Функция DOS 68h: Сброс файловых буферов DOS на диск Вход: AH-68h ВХ - идентификатор Выход: CF - 0, если операция выполнена CF - 1, если произошла ошибка (АХ - код ошибки) Для критических участков программ предпочтительнее использовать более эффективную функцию 0Dh. Функция DOS 0Dh: Сброс всех файловых буферов на диск Вход: АН - 0Dh Выход: Никакого Закрытие и удаление файла Функция DOS ЗЕк. Закрыть файл / Вход: АН - 3Eh ВХ - идентификатор-Выход: CF ™ 0, если не произошла ошибка CF = 1 и АХ = 6, если неправильный идентификатор Если файл был открыт для записи, все файловые буфера сбрасываются на диск, устанавливается время модификации файла и записывается его новая длина. Функция DOS 41 h; Удаление файла Вход: AH-2lh DS: DX - адрес ASCIZ-строки с полным именем файла Выход: CF - 0, если файл удален CF = 1 и АН = 02h, если файл не найден; 03h, если путь не найден; 05h, если доступ запрещен Функция LFN 41h: Удаление файлов с длинным именем Вход: АХ - 7141h DS: DX- адрес ASCIZ-строки с длинным именем файлаSI - OOOOh: маски не разрешены и атрибуты в СХ игнорируются SI- 000th: маски в имени файла и атрибуты в СХ разрешены: CL - атрибуты, которые файлы могут иметь СН - атрибуты, которые файлы должны иметь Выход: CF - 0, если файл или файлы удалены CF - 1 и АХ - код ошибки, если произошла ошибка. Код 7100h означает, что функция не поддерживается Поиск файлов Найти нужный файл на диске намного сложнее, чем просто открыть его, - для этого требуются две функции при работе с короткими именами (найти первый файл и найти следующий файл) и три - при работе с длинными именами в DOS 7.0 (найти первый файл, найти следующий файл, прекратить поиск). Функция DOS 4Eh: Найти первый файл Вход: АН = 4Eh 'AL используется при обращении к функции APPEND СХ -= атрибуты, которые должен иметь файл (биты 0 (только для чтения) и 5 (архивный бит) игнорируются. Если бит 3 (метка тома) установлен, все остальные биты игнорируются) DS: DX = адрес ASCIZ-строки с именем файла, которое может включать путь и маски для поиска (символы * и?) Выход: CF - 0 и область DTA заполняется данными, если файл найден CF - 1 и АХ * 02h, если файл не найден; 03h, если путь не найден; 12h, если неправильный режим доступа Функция DOS 1Ah: Установить область DTA Вход: АН - lAh DS: DX - адрес начала DTA (128-байтный буфер) Функции поиска файлов заполняют DTA следующим образом: +00h: байт- биты 0-6: ASCII-код буквы диска бит 7: диск сетевой +01h; 11 байт - маска поиска (без пути) +0Ch: байт ; - атрибуты для поиска +0Dh: слово - порядковый номер файла в директории +0Fh: слово - номер кластера начала внешней директории +11 h: 4 байта - зарезервировано +15h: байт- атрибут найденного файла +16h: слово - время создания файла в формате DOS: биты 15-11: час (0-23) биты 10-5: минута биты 4-0: номер секунды, деленный на 2 (0—30) +18h: слово -дата создания файла в формате DOS: биты 15-9; год, начиная с 1980 биты 8-5: месяц биты 4-0: день < +lAh; 4 байта - размер файла + lEh: 13 байт - ASCIZ-имя найденного файла с расширением После того как DTA заполнена данными, для продолжения поиска следует вызывать функцию 4Fh, пока не будет возвращена ошибка. Функция LFN4Eh: Найти первый файл с длинным именем Вход: AX = 714Eh CL - атрибуты, которые файл может иметь (биты 0 и 5 игнорируются) СН - атрибуты, которые файл должен иметь SI -= 0: использовать Windows-формат даты/времени SI - 1: использовать DOS-формат даты/времени DS: DX = адрес ASCIZ-строки с маской для поиска (может включать * и?. Для совместимости маска *.* ищет все файлы в директории, а не только файлы, содержащие точку в имейй) ES: DI - адрес 318-байтного буфера для информации о файле Выход: CFв 0 АХ - поисковый идентификатор СХ = Unicode-флаг: бит 0: длинное имя содержит подчеркивания вместо непреобразуемых Unicode-символов бит 1: короткое имя содержит подчеркивания вместо непреобразуемых Unicode-символов CF - 1, АХ = код ошибки, если произошла ошибка (7100h - функция не поддерживается) Если файл, подходящий под маску и атрибуты поиска, найден, область данных по адресу ES: DI заполняется следующим образом: Функция LFN 4Fh: Найти следующий файл Вход: AX = 714Fh ВХ = поисковый идентификатор (от функции 4Eh) SI = формат даты/времени ES: DI = адрес буфера для информации о файле Выход: CF - 0 и СХ = Unicode-флаг, если следующий файл найден CF - 1, АХ - код ошибки, если произошла ошибка (7100h - функция не поддерживается) Функция LFNA1h: Закончить поиск файла Вход: AX~71Alh ВХ - поисковый идентификатор Выход: CF - 0, если операция выполнена; CF - 1 и АХ - код ошибки, если произошла ошибка (7100h - функция не поддерживается).
|