Страница 5 из 41
5.1.3 Получение/установка размера файла. Программа может пожелать проверить размер файла по разным причинам. Одна из возможных причин состоит в определении числа записей, содержащихся в файле. Другая - в определении позиции конца файла, с тем чтобы файловый указатель был установлен верно для добавления в файл новых данных, без изменения существующих. Конечно, размер файла устанавливается автоматически функцией DOS. Иногда программа может нуждаться в резервировании дискового пространства для дальнейшего использования. В этом случае надо открыть файл в режиме прямого доступа и записать такой номер записи, чтобы файл имел достаточную длину. Записи между "фиктив- ной" и реально относящимися к файлу будут заполнены теми данными, которые случайно окажутся в дисковых секторах, отведенных для файла при этой операции.
Высокий уровень. В Бейсике функция LOF (длина файла) возвращает точное число байтов, отведенных файлу (предупреждаем, однако, что старые вер- сии Бейсика - 1.х - возвращают число 128-байтных блоков, исполь-
зуемых файлом). Файл должен быть открыт и ссылаться на него надо по номеру, под которым был открыт файл. Формат X = LOF(1). В следующем примере определяется сколько 64-байтных записей содер- жится в файле, открытом как #3:
100 OPEN "FILENAME" AS #3 'открываем файл 110 RECORDLEN = 64 'определяем длину записи 120 NUMBREC = LOF(3)/RECORDLEN 'вычисляем число записей
Средний уровень. FCB функция 23H прерывания 21H сообщает число записей в файле. Если приписать файлу длину записи в 1 байт, то его размер будет возвращен в байтах. DS:DX должны указывать на управляющий блок открытого файла. Затем вызовите функцию. Если файл не найден, то в AL возвращается FF. В противном случае в AL возвращается 0, а число записей помещается в поле номера записи прямого доступа FCB (байты 33-36). Для правильной работы поле длины записи FCB должно быть установлено после открытия файла, но перед вызовом функции; это двухбайтное поле расположено по смещению 14 в FCB. Если раз- мер файла неточно делится на длину записи, то сообщаемое число записей округляется вверх. Вот пример, в котором используется длина записи равная 1:
;---определение размера файла LEA DX,FCB ;DS:DX указывает на FCB MOV BX,DX ;копируем указатель в BX MOV CX,1 ;размер записи в CX MOV [BX]+14,CX ;пишем в поле размера записи FCB MOV AH,23H ;функция сообщающая размер файла INT 21H ;вызов функции MOV AX,[BX]+33 ;получаем младшую часть размера файла MOV CX,[BX]+35 ;получаем старшую часть размера файла
Можно также устанавливать длину файла, используя управляющие блоки файла. Для этого надо использовать функцию записи блока с прямым доступом, которая обсуждается в [5.4.5]. У этой функции имеется частный случай, когда число записанных записей устанавли-
вается равным нулю, то длина файла устанавливается равной числу записей, указанному в поле записи прямого доступа. Метод, использующий дескриптор файла (file handle) не имеет функции, которая непосредственно сообщала бы длину файла, однако имеется возможность вычислить размер, передвинув указатель файла с начала на конец файла. При открытии файла указатель файла авто- матически устанавливается на первый байт файла. Указатель файла перемещается функцией 42H прерывания 21H. Надо поместить в AL кодовое число 2, напраляющее указатель на конец файла. В BX дол- жен быть указан номер файла, а CX:DX содержит смещение от конца файла до позиции, в которую должен быть установлен указатель, поэтому поместите 0 в оба этих регистра. Затем вызовите функцию. При возврате DX:AX будет содержать новую позицию указателя, отно- сительно его предыдущей позиции - т.е. будет содержать длину
файла (DX содержит старший байт). При возникновении ошибки будет установлен флаг переноса, а в AX будет возвращено 1, если непра- вилен номер функции и 6, если неправилен номер файла. Не забудьте затем снова вернуть указатель на начало файла, если это необходи- мо. Поместите 0 в AL, CX и DX и вызовите функцию снова. Вот при- мер:
;---открываем файл LEA DX,FILE_PATH ;DS:DX указывают на путь файла MOV AL,0 ;открываем для чтения MOV AH,3DH ;функция открытия файла INT 21H ;открываем его JC OPEN_ERROR ;проверка на ошибку MOV HANDLE,AX ;запоминаем номер файла ;---определяем длину файла MOV AH,42H ;функция перемещения указателя MOV AL,2 ;код установки на конец файла MOV BX,HANDLE ;номер файла в BX MOV CX,0 ;0 в CX и DX MOV DX,0 ; INT 21H ;сдвигаем указатель JC POINTER_ERROR ;ошибка? MOV FSIZE_HIGH,DX ;запоминаем размер файла MOV FSIZE_LOW,DX ;
|