Страница 15 из 41
Раздел 3. Подготовка к работе с файлами. Программы, написанные на языках высокого уровня могут просто открыть файл и вся подготовительная работа для операций с файлами будет выполнена автоматически. Однако программисты на языке ас- семблера должны создать специальные области данных, которые ис- пользуются при операциях ввода/вывода. MS DOS использует два метода доступа к файлам, метод управляющего блока файла (FCB) и метод дескриптора файла. Метод FCB сохранился с тех пор, когда MS DOS не работала с древовидной структурой каталогов, поэтому с его помощью можно получить доступ только к файлам, находящимся в текущем каталоге. Метод дескриптора файла позволяет получить доступ к любому файлу, независимо от того, какой каталог является текущим. Поскольку теперь древовидная структура каталогов широко ис- пользуется, то метод FCB становится анахронизмом, однако MS DOS продолжает поддерживать этот метод, чтобы сохранить совместимость со старым программным обеспечением и по этой причине мы рассмот- рим и его. Однако в своих программах всегда используйте метод дескриптора файла. Метод дескриптора файла имеет дополнительное преимущество в том, что он требует меньше подготовительной рабо- ты. Однако в некоторых приложениях сами операции ввода/вывода при его использовании могут оказаться более сложными, чем в методе FCB. Например, операции чтения файла с прямым доступом с исполь- зованием метода дескриптора файла требуют чтобы программа вычис- ляла смещение каждой записи в файле, в то время как соответствую- щая функция FCB получает номер записи и делает необходимые вычис- ления сама. Прежде чем читать или писать данные файл должен быть открыт. Открыть файл это значит создать и инициализировать специальную область данных, используемую MS DOS, которая содержит важную информацию о файле, такую как имя файла, имя накопителя, размер записи файла и т.д. Языки высокого уровня, такие капк Бейсик, создают эти области автоматически. Одной из таких областей яв- ляется управляющий блок файла и когда используется метод FCB, то программа создает этот блок, а MS DOS читает и манипулирует его содержимым. Первоначально FCB содержит только имя файла и имя накопителя; после того как файл открывается в него добавляется информация о размере записи файла и о текущей позиции, с которой к нему будет осуществляться доступ. С другой стороны, при доступе с помощью дескриптора файла MS DOS автоматически создает область данных для файла в произвольном месте. Затем MS DOS создает уникальный 16-битный код номера файла и впоследствии этот "номер" используется функциями DOS для иден- тификации того, с каким из открытых файлов производится операция. Все что нужно для нахождения файла - это стандартная строка пути, в которой может быть необязательное имя накопителя и имена подка- талогов должны быть разделены обратной косой чертой. Эти строки отличаются от стандартного запроса MS DOS только тем, что они должны завершаться байтом ASCII 0, с тем чтобы программа могла найти конец строки (такие строки называются строками ASCIIZ). Операции по пересылке данных из или в файл требуют, чтобы была указана область памяти в которую или из которой будут направлять- ся данные. Такой буфер определяется отведением ему места в памяти
и установкой указателя на его первый байт (т.е. на младший адрес буфера в памяти). Если передано слишком много данных, то буфер переполняется и может разрушить данные, расположенные в следующих адресах памяти. Буфер может использоваться как промежуточный буфер, работающий только с небольшой порцией данных для операций чтения или записи. Или буфер может помещаться в область памяти, в которой программа действительно хранит и обрабатывает данные. Функции доступа через управляющий блок файла определяют проме- жуточный буфер с помощью указателя, которой все время хранится операционной системой. Этот буфер называется область обмена с диском (disk transfer area) или DTA. К сожалению, техническая документация по IBM PC часто называет термином DTA указатель на буфер, хотя на самом деле правильно называть его указателем на DTA. После того как указатель на DTA установлен с помощью спе- циальной функции, все файловые операции используют его до тех пор пока он не будет изменен. С другой стороны, функции, использующие дескриптор файла, должны указывать стартовый адрес буфера обмена каждый раз при вызове функции и они игнорируют указатель на DTA, используемый функциями управляющего блока файла. Рисунок 5-2 показывает два метода доступа к файлам.
|