Операционная система MS-DOS© Александр Фролов, Григорий ФроловТом 1, книга 3, М.: Диалог-МИФИ, 1992. 3.7. Изменение атрибутов, времени и даты файловНапомним: атрибуты файла, время и дата его последней модификации, а также размер файла хранятся в дескрипторе файла. Дескриптор файла находится в каталоге. Операционная система предоставляет вам все необходимые средства для изменения всех полей дескриптора файла, кроме номера начального кластера. Для изменения этого номера вам придется работать с каталогом через таблицу размещения файлов FAT. Вам придется сначала считать каталог по кластерам с помощью прерывания INT 25h, модифицировать нужные поля и записать каталог обратно на диск при помощи прерывания INT 26h. Для работы с полем атрибутов файла
предназначена функция 43h прерывания INT 21h:
При изменении атрибутов файла допустимо указывать комбинации битов в регистре CX. Если ваша программа работает в сети, она должна иметь соответствующие права доступа к каталогу, содержащему файл, для которого программа собирается изменять байт атрибутов. Для работы с полями времени и даты последней
модификации файла предназначена функция 57h
прерывания INT 21h:
Для того, чтобы изменить время или дату последней модификации файла с помощью этой функции, файл предварительно должен быть открыт. Формат времени и даты для этой функции такой же, как и используемый в дескрипторе каталога. Приведем эти форматы еще раз для удобства. Формат поля времени: 15 11 10 5 4 0 ++ ¦ Часы (0...23) ¦ Минуты (0...59) ¦ Секунды/2 (0...29) ¦ ++ Формат поля даты: 15 9 8 5 4 0 ++ ¦ Год (0...119) ¦ Месяц (1...12) ¦ День (1...31) ¦ ++ Стандартные библиотеки трансляторов Microsoft QC 2.5 и C 6.0 содержат функции для чтения и изменения атрибутов файлов и времени/даты их последней модификации. Для определения атрибутов файла можно использовать функцию _dos_getfileattr(): unsigned _dos_getfileattr(char *path, unsigned *attrib); Эта функция получает атрибуты файла, заданного первым аргументом, и записывает байт атрибутов в младший байт по адресу, указанному вторым параметром. В случае успешного завершения функция возвращает 0, в противном случае она возвращает код ошибки, полученный от операционной системы и устанавливает глобальную переменную errno в значение ENOENT, что означает отсутствие указанного в параметре path файла. Для изменения атрибутов файла можно использовать функцию _dos_setfileattr(): unsigned _dos_setfileattr(char *path, unsigned attrib); Параметр attrib может принимать следующие
значения:
Для определения времени последней модификации файла можно использовать функцию _dos_getftime(): unsigned _dos_getftime(int handle, unsigned *date, unsigned *time); Перед использованием этой функции программа должна открыть файл. Дата и время записываются по адресу, указываемому, соответственно, вторым и третьим параметрами. Если вам надо изменить время или дату последней модификации файла, используйте функцию _dos_setftime(): unsigned _dos_setftime(int handle, unsigned date, unsigned time); Параметры этой функции аналогичны используемым в функции _dos_getftime(), за исключением того, что в качестве второго и третьего параметра применяются не указатели, а непосредственные значения даты и времени. Приведем программу, изменяющую при запуске значение бита файла атрибутов "Только читаемый" для файла, имя которого передается программе в качестве параметра: #include <dos.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> void main(int argc, char *argv[]); void main(int argc, char *argv[]) { unsigned fattr; _dos_getfileattr(argv[1], &fattr); _dos_setfileattr(argv[1], fattr ^ _A_RDONLY); } Программа сначала считывает байт атрибутов, затем инвертирует соответствующий бит и устанавливает новое значение байта атрибутов. |