Страница 12 из 41
5.2.5 Получение/установка времени и даты последнего доступа к файлу. Если отсчитывать от нуля, то байты 22-23 32-байтного элемента каталога содержат время последнего доступа к файлу. Байты 24-25 - содержат дату. Значение битов следующее:
Время: биты 11-15 часы (0-23) 5-10 минуты (0-59) 0-4 секунды (0-29 с 2-секундным интервалом)
Дата: биты 9-15 год (0-119, смещение с 1980 года) 5-8 месяц (1-12) 0-4 число (1-31)
День недели не записывается; DOS вычисляет его по остальной ин- формации. Отметим также, что как всегда, младший байт этих 2-байтных значений расположен раньше в памяти, чем старший.
Средний уровень. Метод доступа к файлу с использованием управляющего блока файла позволяет получить дату последнего доступа к файлу, но не время. Когда FCB открывается функцией 0FH прерывания 21H, то заполняется двухбайтное поле даты в вышеприведенном формате. Это поле расположено в FCB со смещением 14H [5.3.5]. С другой стороны, доступ к файлу с помощью дескриптора файла позволяет как получить, так и установить дату и время последнего доступа к файлу. Функция 57H прерывания 21H выполняет все опера- ции. Для установки времени и даты поместите номер файла в BX, и 0 в AL. Для получения даты и времени надо поместить в AL 1. В обоих случаях дата содержится в DX, а время в CX. Значение битов совпа- дает с тем, что описано в таблице. В техническом руководстве по MS DOS утверждается, что младшие байты информации находятся в CH и DH, и наоборот. На самом деле это не так. При возникновении ошибки устанавливается флаг переноса, а в AX возвращается 1, если в AL указано неправильное число и 6, если плохой дескриптор фай- ла. В следующем примере определяется час, в который был последний лоступ к файлу:
;---в сегменте данных PATH DB 'B:NEWDATA.BAK',0 ;---открываем файл LEA DX,PATH ;указываем на строку пути MOV AH,3DH ;функция открытия файла MOV AL,0 ;открываем для чтения INT 21H ;открываем файл JC OPEN_ERROR ;переход на обработку ошибки ;---получаем дату и время доступа к файлу MOV BX,AX ;помещаем номер файла в BX MOV AL,0 ;код для чтения времени MOV AH,57H ;номер функции INT 21H ;получаем время доступа JC TIME_ERROR ;переход на обработку ошибок ;---сдвигаем биты, относящиеся к часам, в начало CH MOV CL,3 ;готовим сдвиг SHR CH,CL ;теперь CH содержит час доступа
|