Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Работа с файловой системой DOS.doc
Скачиваний:
3
Добавлен:
16.11.2019
Размер:
299.01 Кб
Скачать

Void main(void);

Void main(void) {

Int handle;

long position, length;

char buffer[2], fname[80];

// Запрашиваем имя файла, с которым будем работать

printf("Введите имя файла: ");

gets(fname);

// Открываем файл

handle = open(fname, O_BINARY | O_RDONLY);

// Если такого файла нет, выводим сообщение об ошибке

// и завершаем работу программы

if(handle == -1) {

printf("\nНет такого файла!");

exit(-1);

}

// Определяем и выводим на экран размер файла в байтах

length = filelength(handle);

printf("\nДлина файла %s составляет %ld байтов\n", fname, length);

// Запрашиваем позицию для чтения и отображения байта

do {

printf("Введите позицию: ");

scanf("%ld", &position);

} while(position > length);

// Устанавливаем заданную позицию

lseek(handle, position, SEEK_SET);

// Читаем один байт в буфер, начиная с установленной

// позиции

if(read(handle, buffer, 1) == -1) {

// Для вывода сообщения об ошибке используем функцию perror(),

// которая добавляет к сообщению, заданному в параметре,

// расшифрованное системное сообщение об ошибке.

// Код ошибки функция perror() берет из переменной errno.

perror("Ошибка при чтении");

exit(-1);

}

// Выводим считанный байт на экран

printf( "Смещение: %ld; байт: %02.2x ('%c')\n",

position, (unsigned char)*buffer, *buffer);

// Определяем текущую позицию и выводим ее

// на экран

position = tell(handle);

printf("\nТекущая позиция в файле: %ld\n", position);

// Закрываем файл

close(handle);

}

3.7. Изменение атрибутов, времени и даты файлов

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

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

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

На входе:

AH = 43h

AL = выполняемая операция: 00h чтение атрибутов файла 01h установка новых атрибутов файла

CX = новые атрибуты файла, если AL = 01h: Биты: 5 - бит архивации 4 - каталог 3 - метка диска 2 - системный файл 1 - скрытый файл 0 - только читаемый файл

DS:DX = путь файла в формате ASCIIZ

На выходе:

AX = Код ошибки, если был установлен в 1 флаг переноса CF

CX = Если не было ошибки, этот регистр содержит атрибуты файла

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

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

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

На входе:

AH = 57h

AL = выполняемая операция: 00h чтение даты и времени 01h установка даты и времени

BX = файловый индекс открытого файла

CX = время

DX = дата

На выходе:

AX = Код ошибки, если был установлен в 1 флаг переноса CF

CX = Если не было ошибки, этот регистр содержит время последнего изменения файла

DX = Если не было ошибки, этот регистр содержит дату последнего изменения файла

Для того, чтобы изменить время или дату последней модификации файла с помощью этой функции, файл предварительно должен быть открыт. Формат времени и даты для этой функции такой же, как и используемый в дескрипторе каталога. Приведем эти форматы еще раз для удобства.

Формат поля времени:

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 может принимать следующие значения:

_A_ARCH

установка бита архивации

_A_HIDDEN

файл скрытый

_A_NORMAL

обычный файл

_A_RDONLY

только читаемый файл

_A_SUBDIR

каталог

_A_SYSTEM

системный файл

_A_VOLID

метка диска

Для определения времени последней модификации файла можно использовать функцию _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>