1 ЛЕКЦИЯ 9 РАБОТА С ФАЙЛАМИ В MS DOS Для использования файла в программе обычно необходимо выполнить следующие операции: создание нового файла; открытие существующего файла; запись/чтение в/из файл(а); закрытие файла. MS DOS поддерживает эти операции с помощью набора функций прерывания 21h. Кроме этих функций данное прерывание содержит функции для работы с каталогами: создать каталог; удалить каталог; сменить каталог.
2 Существует также ряд других функций для работы с файловой системой, в том числе для поиска файлов и получения информации о них. Создание, открытие, закрытие и удаление файла Прежде чем использовать файл в программе, его необходимо открыть с помощью функции 3dh int 21h. Если файл не существует, то перед открытием его нужно создать. Оба эти действия выполняются одной из следующих функций: 3ch, 5bh, 5ah, 6ch. Создание файла с усечением существующего до нулевой длины ВХОД: AH=3ch; СХ= атрибуты файла (значения битов: 0=1 – только чтение; 1=1 – скрытый файл; 2=1 – системный файл; 3=0 – игнорируется; 4=0 – зарезервирован (каталог), должен быть равен 0; 5 – бит архивации; 6=0 – резерв; 7=1 – общий файл в системе Novell Netware; 8…15=0 – резерв); DS:DX – ASCII – имя файла. ВЫХОД: CF=0 – AX – дескриптор файла; CF=1 – АХ= код ошибки (3 – нет такого пути; 4 – нет свободного дескриптора файла; 5 – доступ отказан).
3 Открытие существующего файла Когда файл создан, его можно открыть функцией 3dh. При этом необходимо указать режим доступа к файлу. ВХОД: АН = 3dh; AL = режимы доступа и разделения – определяются состоянием битов: 2-0 – режимы доступа (000 – только чтение; 001 – только запись; 010 – чтение/запись); 3 – зарезервирован (0); 6-4 – режим совместного использования (000 – режим совместимости; 001 – запрещение чтения и записи другими программами; 010 – запрещение записи другими программами; 011 – запрещение чтения другими программами; 100 – разрешение полного доступа другим программам; 111 – сетевой FCB (доступен только в течение серверного вызова)); 7 – наследование (если установлен, то файл принадлежит только текущему процессу и не наследуется дочерними процессами); DS:DX – адрес ASCII – цепочки с именем файла. ВЫХОД: CF=0 – АХ= дескриптор файла; CF=1 – АХ= код ошибки: 3 – нет такого пути; нет свободного дескриптора файла; 5 – доступ отказан; 12h – недействительный код доступа. Указатель в файле устанавливается на начало файла.
4 Создание нового файла с сохранением существующего В отличие от 3ch позволяет провести процесс открытия существующего файла без усечения до нулевой длины. ВХОД: АН=5bh; СХ= атрибуты файла; DS:DX= ASCII – имя файла. ВЫХОД: CF=0 – АХ= дескриптор файла; CF=1 – АХ= код ошибки: 3 – нет такого пути; нет свободного дескриптора файла; 5 – доступ отказан; 50h – файл существует. Если указанный файл существует, то функция 5bh завершается с кодом ошибки 50h (CF=1). Поэтому после вызова данной функции необходимо анализировать флаг CF (командой JC или JNC), если CF =1, то для открытия файла необходимо дополнительно вызвать функцию 3dh. Открытие или создание файла с расширенными возможностями Функция 6сh появилась, начиная с версии DOS 4.0. При ее использовании нет необходимости отслеживать существование создаваемого файла. Для корректной работы достаточно задать нужные значения в соответствующих регистрах. Анализ возможных значений показывает,
5 что данная функция фактически заменяет рассмотренные ранее функции создания и открытия файлов. ВХОД: AX= 6c00h; BL= флаги – режим открытия (значения битов: 7 – наследование; 4-6 – режим разделения; 3=0 – резерв; 0-2 – режим доступа); ВН= флаги (значения битов: 6=0 – использовать стандартную для MS DOS буферизацию: 6=1 – отменить стандартную для MS DOS буферизацию; 5=0 – использовать обычный обработчик ошибок (int 24h); 5=1 – не использовать обычный обработчик ошибок (int 24h), для выяснения причины ошибки использовать функцию 59h int 21h); СХ= атрибуты создаваемого (и только) файла; DL= действия, если файл существует или не существует (значения бит: 0-3 – действие, если файл существует (0000 – вернуть ошибку; 0001 – открыть файл; 0010 – открыть файл без сохранения существующего); 4-7 – действие, если файл не существует (0000 – вернуть ошибку; 0001 – открыть файл; 0010 – создать и открыть файл)); DH=00h – резерв; DS:SI – адрес строки с ASCII – именем файла. ВЫХОД: CF=0 - успешное выполнение функции: АХ= дескриптор файла, СХ = состояние (0 – файл открыт; 1 – файл создан и открыт; 2 – файл открыт без сохранения содержимого существующего файла); CF=1 – АХ= код ошибки.
6 Закрытие файла В конце работы с файлом его нужно закрыть. Вообще это действие не является обязательным, так как функция 4с00h, которая завершает выполнение программы, в числе прочих действий выполняет и закрытие всех файлов. ВХОД: АН= 3eh; ВХ= дескриптор файла, полученный при его открытии. ВЫХОД: CF=0- АХ= значение не определено; CF=1 – АХ= код ошибки: 6 – недопустимый дескриптор. Во время закрытия файла выполняются все незаконченные операции записи на диск в элементе каталога, соответствующем файлу, модифицируется различные поля, в том числе поля времени и даты устанавливаются в соответствии с текущим временем. Удаление файла При необходимости файл может быть удален функцией 41h. ВХОД: АН= 41h: DS:DX – ASCII – имя файла (в последних версиях MS DOS можно использовать символы группирования * и ?);
7 CL= атрибуты удаляемого файла. ВЫХОД: CF=0 – АХ= не определено; CF=1 – АХ= код ошибки: 2 – файл не найден; 3 – нет такого пути; 5 – в доступе отказано. Функция 41h не позволяет удалять файлы с атрибутом «только для чтения». В этом случае необходимо изменить атрибуты удаляемого файла с помощью функции 43h. Создание временного файла ВХОД: АН= 5ah; СХ= атрибуты файла; DS:DX – указатель на ASCII – строку с путем, заканчивающимся символом \ и 13 дополнительными нулевыми байтами, которые в результате вызова функции будут заполнены символами сгенерированного имени. ВЫХОД: CF=0 – АХ= дескриптор файла, открытого для чтения/записи в режиме совместимости; DS:DX – путь к файлу, дополненный сгенерированным именем временного файла; CF=1 – АХ= код ошибки: 3 – нет такого пути; 4 – нет свободного дескриптора файла; 5 – в доступе отказано 50h – файл существует.
8 В результате вызова функции 5ah создается файл с уникальным именем, который после своего закрытия должен быть явно удален создавшей его программой. Закрытие файла производится функцией 3eh. Чтение, запись, позиционирование в файле При работе с функциями чтения и записи можно использовать не только дескрипторы заранее открытых файлов, но и дескрипторы стандартных устройств. Эти дескрипторы имеют постоянные значения и доступны в любое время функционирования системы: 0– клавиатура; 1 и 2 – экран; 3- последовательный порт СОМ1; 4 – параллельный порт LPT1. Установка текущей файловой позиции Чтение-запись в файле производятся с текущей файловой позиции, на которую указывает файловый указатель. Функция 42h MS DOS предоставляет гибкие возможности как для начального, так и для текущего позиционирования файлового указателя для последующей операции ввода- вывода. ВХОД: АН=42h; ВХ= дескриптор файла, полученный при его открытии;
9 АL= начальное положение в файле, относительно которого производится операция чтения-записи (00h – смещение (беззнаковое значение в CX:DХ) от начала файла; 01h – смещение (значение со знаком в СХ:DX) от текущей позиции в файле; 02h – смещение (значение со знаком в СХ:DX) от конца файла); СХ:DX= смещение новой позиции в файле относительно начальной. ВЫХОД: CF=0 – DX:AX = значение новой позиции в байтах относительно начала файла; CF=1 – АХ= код ошибки: 1 – неверное в AL; 2 – недопустимый дескриптор файла. Методы позиционирования, заданные величиной в AL, по-разному трактуют значения в паре регистров CX:DX. Метод AL=0 трактует значение в CX:DX как абсолютное. Два других метода трактуют содержимое в CX:DX как значение со знаком. Необходимо быть внимательным при выполнении операции позиционирования для избежания последующих ошибок при операции чтения-записи. Так, значение в CX:DX, позиционирующее указатель может указывать за пределы файла. При этом выделяются два случая: значение в CX:DX указывает на позицию перед началом файла – в этом случае последующая операция чтения-записи будет выполнена с ошибкой;
10 значение в CX:DX указывает на позицию за концом файла – и в этом случае последующая операция записи приведет к расширению файла в соответствии со значением в CX:DX. Запись в файл или устройство Запись в файл производится функцией 40h с текущей позиции файлового указателя. ВХОД: АН= 40h; ВХ= дескриптор файла; СХ= количество байтов для записи; DS:DX – указатель на область, из которой записываются данные. ВЫХОД: CF=0 – AX = число действительно записанных байтов в файл или устройство; CF=1 – АХ= код ошибки: 5 – в доступе отказано; 6 – недопустимый дескриптор. Если при вызове функции 40h регистр СХ равен нулю, то данные в файл не записываются и он усекается или расширяется до текущей позиции файлового указателя. Если СХ не равен нулю, то данные в файл записываются начиная с текущей позиции файлового указателя. Операция записи также продвигает файловый указатель на число действительно записанных байтов.
11 Принудительное сохранение буферов на диск Буферизация ввода-вывода в MS DOS организована таким образом, что запись из буфера на диск производится при его заполнении, что эффективно при работе с одними и теми же данными в режиме чтения-записи. Для принудительной записи буферов на диск используется функция 68h. ВХОД: АН=68h; ВХ= дескриптор файла. ВЫХОД: CF=0 в случае успеха; CF=1 АХ= код ошибки. Чтение из файла или устройства Чтение из файла в область памяти осуществляется функцией 3fh. ВХОД: АН=3fh; ВХ= дескриптор файла; СХ= количество байтов для чтения; DS:DX – указатель на область памяти, в которую помещаются прочитанные байты. ВЫХОД: CF= 0 – АХ= число действительно прочитанных из файла; CF=1 – АХ= код ошибки: 5 – в доступе отказано; 6 – недопустимый дескриптор. Чтение данных производится начиная с текущей позиции в файле, которая
12 после успешного чтения смещается на значение, равное количеству прочитанных байтов. Если в качестве файла используется стандартная консоль (клавиатура), то чтение производится до первого символа CR (carriage return) с кодом 0dh, соответствующим нажатию клавиши Enter. Кроме символов введенной строки в ее конец помещаются символы 0dh и 0ah. Это необходимо учитывать при задании размера буфера для ввода. Получение и изменение атрибутов файла MS DOS позволяет получить для анализа и при необходимости изменить имя файла, байт атрибутов файла, время и дату его последней модификации в элементе каталога, соответствующего этому файлу. Для этого предназначены функции 43h, 56h, 57h. Подфункция 00 функции 43h прерывания 21h предназначена для получения слова атрибутов файла. Получить атрибуты файла ВХОД: АХ= 4300h; DS:DX – ASCII – строка с именем (путем) файла. ВЫХОД: CF=0 – СХ= слово атрибутов файла; CF=1 – АХ= код ошибки: неверное значение в AL; 2 – файл не найден; 3 – несуществующий путь; 5 – доступ запрещен.
13 Формат байта атрибутов: БитыОписание Разделяемый в Novell Net Ware Не используется Архивный Каталог Метка тома (только исполнение Novell Net Ware) Системный Скрытый Только чтение Установить атрибуты файла Подфункция 01 функции 43h прерывания 21h предназначена для установления слова атрибутов файла.
14 ВХОД: АХ= 4301h; СХ= новое слово атрибутов файла; DS:DX – ASCII – строка с именем (путем) файла. ВЫХОД: CF = 0 – АХ= не определено; CF=1 – АХ= код ошибки: 1- неверное значение в AL; 2 – файл не найден; 3 – несуществующий путь; 5 – доступ запрещен. Переименовать файл Для переименования файла используется функция 56h. ВХОД: АН=56h; DS:DX – ASCII – имя (путь) файла; ВЫХОД: CF=0 – при успешном переименовании; CF=1 – АХ = код ошибки: 2- файл не найден; 3 – несуществующий путь; 5 – доступ запрещен; 11h – устройство для старого и нового файлов не совпадают. Получить дату и время создания или последней модификации файла Получить/изменить дату и время создания или модификации файла можно с помощью подфункций функции 57h. ВХОД: АХ= 5700h; ВХ= дескриптор файла.
15 ВЫХОД: CF=0 : СХ= время, DX = дата. CF=1 : АХ= код ошибки 1- недопустимый номер подфункции в AL; 6 – недопустимый дескриптор. Формат представления времени и даты файла ВремяДата БитыОписаниеБитыОписание 15 –11 10 – Часы (0 – 23) Минуты Секунды 15 – 9 8 – Год Месяц День Установить дату и время создания или последней модификации файла ВХОД: АХ= 5701h; ВХ= дескриптор файла; СХ= новое время; DX= новая дата. ВЫХОД: CF=0: СХ= время, DX= дата. CF=1 – АХ= код ошибки: 1 – недопустимый номер подфункции в AL; 6 – недопустимый дескриптор.