Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

MS-DOS для программиста

© Александр Фролов, Григорий Фролов
Том 19, М.: Диалог-МИФИ, 1995, 253 стр.

[Назад] [Содеожание] [Дальше]

3.7. Изменение дескриптора файла

Напомним: атрибуты файла, время и дата его последней модификации, а также размер файла хранятся в дескрипторе файла. Дескриптор файла находится в каталоге.

Операционная система предоставляет вам все необходимые средства для изменения всех полей дескриптора файла, кроме номера начального кластера. Для изменения этого номера вам придется работать с каталогом через таблицу размещения файлов FAT . Для этого нужно сначала считать каталог по кластерам с помощью прерывания INT 25h , модифицировать нужные поля и записать каталог обратно на диск при помощи прерывания INT 26h .

Атрибуты файла

Для работы с полем атрибутов файла предназначена функция 43h прерывания INT 21h :

На входе: AH 43h
AL Выполняемая операция: 00h - чтение атрибутов файла;01h - установка новых атрибутов файла
CX Новые атрибуты файла, если AL = 01h:Биты регистра CX:5 - бит архивации; 4 - каталог;3 - метка диска;2 - системный файл; 1 - скрытый файл; 0 - только читаемый файл
DS:DX Путь к файлу в формате строки ASCIIZ
На выходе: AX Код ошибки, если установлен флаг переноса CF
CX Если не было ошибки, этот регистр содержит атрибуты файла

При изменении атрибутов файла допустимо указывать комбинации битов в регистре CX.

Если ваша программа работает в сети, она должна иметь соответствующие права доступа к каталогу, содержащему файл, для которого программа собирается изменять байт атрибутов.

Время и дата изменения файла

Для работы с полями времени и даты последней модификации файла предназначена функция 57h прерывания INT 21h :

На входе: AH 57h
AL Выполняемая операция:
00h - чтение даты и времени;01h - установка даты и времени
BX Идентификатор открытого файла
CX Время
DX Дата
На выходе: AX Код ошибки, если установлен флаг переноса CF
CX Если не было ошибки, этот регистр содержит время последнего изменения файла
DX Если не было ошибки, этот регистр содержит дату последнего изменения файла

Для того чтобы изменить время или дату последней модификации файла с помощью этой функции, файл предварительно должен быть открыт. Формат времени и даты для этой функции такой же, как и используемый в дескрипторе каталога (рис. 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 может принимать следующие значения:

Значение Описание
_A_ARCH Установка бита архивации
_A_HIDDEN Скрытый файл
_A_NORMAL Обычный файл
_A_RDONLY Только читаемый файл
_A_SUBDIR Каталог
_A_SYSTEM Системный файл
_A_VOLID Метка диска

_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);
}

Программа сначала считывает байт атрибутов, затем инвертирует соответствующий бит и устанавливает новое значение байта атрибутов.

[Назад] [Содеожание] [Дальше]