MS-DOS для программиста© Александр Фролов, Григорий ФроловТом 19, М.: Диалог-МИФИ, 1995, 253 стр. 3.7. Изменение дескриптора файлаНапомним: атрибуты файла, время и дата его последней модификации, а также размер файла хранятся в дескрипторе файла. Дескриптор файла находится в каталоге. Операционная система предоставляет вам все необходимые средства для изменения всех полей дескриптора файла, кроме номера начального кластера. Для изменения этого номера вам придется работать с каталогом через таблицу размещения файлов FAT . Для этого нужно сначала считать каталог по кластерам с помощью прерывания INT 25h , модифицировать нужные поля и записать каталог обратно на диск при помощи прерывания INT 26h . Атрибуты файлаДля работы с полем атрибутов файла
предназначена функция 43h прерывания INT 21h :
При изменении атрибутов файла допустимо указывать комбинации битов в регистре CX. Если ваша программа работает в сети, она должна иметь соответствующие права доступа к каталогу, содержащему файл, для которого программа собирается изменять байт атрибутов. Время и дата изменения файлаДля работы с полями времени и даты последней
модификации файла предназначена функция 57h
прерывания INT 21h :
Для того чтобы изменить время или дату последней модификации файла с помощью этой функции, файл предварительно должен быть открыт. Формат времени и даты для этой функции такой же, как и используемый в дескрипторе каталога (рис. 2.4 и 2.5). Функции библиотеки Borland C++Стандартная библиотека Borland C++ содержит функции для чтения и изменения атрибутов файлов, а также времени и даты их последней модификации. _dos_getfileattrДля определения атрибутов файла можно использовать функцию _dos_getfileattr : unsigned _dos_getfileattr (char *path, unsigned *attrib); Эта функция получает атрибуты файла, заданного первым аргументом, и записывает байт атрибутов в младший байт по адресу, указанному вторым параметром. В случае успешного завершения функция возвращает 0. При ошибке она возвращает код ошибки, полученный от операционной системы и устанавливает глобальную переменную errno в значение ENOENT, что означает отсутствие файла, указанного в параметре path. _dos_setfileattrДля изменения атрибутов файла можно использовать функцию _dos_setfileattr : unsigned _dos_setfileattr (char *path, unsigned attrib); Параметр attrib может принимать следующие
значения:
_dos_getftimeДля определения времени последней модификации файла можно использовать функцию _dos_getftime : unsigned _dos_getftime (int handle, unsigned *date, unsigned *time); Перед использованием этой функции программа должна открыть файл. Дата и время записываются по адресу, указываемому, соответственно, вторым и третьим параметрами. _dos_setftimeЕсли вам надо изменить время или дату последней модификации файла, используйте функцию _dos_setftime : unsigned _dos_setftime (int handle, unsigned date, unsigned time); Параметры этой функции аналогичны используемым в функции _dos_getftime , за исключением того что в качестве второго и третьего параметра применяются не указатели, а непосредственные значения даты и времени. Программа READONLYПриведем программу READONLY (листинг 3.6), изменяющую на противоположное значение бита файла атрибутов "Только читаемый" для файла, имя которого передается программе в качестве параметра. Листинг 3.6. Файл readonly\readonly.cpp #include <dos.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #pragma argsused void main(int argc, char *argv[]) { unsigned fattr; _dos_getfileattr (argv[1], &fattr); _dos_setfileattr (argv[1], fattr ^ _A_RDONLY); } Программа сначала считывает байт атрибутов, затем инвертирует соответствующий бит и устанавливает новое значение байта атрибутов. |