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

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

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

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

3.4. Работа с файлами

В этом разделе мы рассмотрим функции MS-DOS, предназначенные для создания, открытия, удаления, переименования и перемещения файлов. Операции чтения из файла и записи в файл будут описаны в следующем разделе.

Создание файлов

Для создания файла предназначена функция 3Ch прерывания INT 21h. С помощью этой функции может быть создан файл как в текущем, так и в любом другом каталоге. Если файл с указанным именем уже существует, он обрезается до нулевой длины. Будьте осторожны при использовании этой функции - она может уничтожить файл.

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

Приведем параметры вызова функции создания файла:

На входе: AH 3Ch
CX Атрибуты создаваемого файла:
00h - обычный файл;
01h - только читаемый файл;
02h - скрытый файл;
04h - системный файл
DS:DX Адрес строки, содержащей путь к файлу
На выходе: AX Код ошибки, если был установлен флаг переноса CF;
Идентификатор файла, если флаг переноса CF сброшен

При выполнении этой функции возможно возникновение следующих ошибок:

  • отсутствует какой-либо элемент в пути для создаваемого файла, например, диск или каталог;
  • была сделана попытка создать файл в корневом каталоге, но корневой каталог переполнен;
  • в указанном каталоге уже есть файл с таким именем, и этот файл имеет атрибут "Только читаемый";
  • пользователь, который работает в сети, не имеет прав доступа для выполнения указанной операции.

Операционная система игнорирует попытки создания с помощью этой функции каталога или метки диска.

Для того чтобы при создании файла случайно не уничтожить содержимое уже существующего файла с таким же именем, программа может использовать функцию 5Bh. Эта функция проверяет заданный путь на предмет наличия указанного файла. Если такой файл уже существует, функция возвращает программе признак ошибки:

На входе: AH 5Bh
CX Атрибуты создаваемого файла:
00h - обычный файл;
01h - только читаемый файл;
02h - скрытый файл;
04h - системный файл
DS:DX Адрес строки, содержащей путь к файлу
На выходе: AX Код ошибки, если был установлен флаг переноса CF;
Идентификатор файла, если флаг переноса CF сброшен

Если вам требуется временный файл, вы можете создать его с помощью функции 5Ah:

На входе: AH 5Ah
CX Атрибуты создаваемого файла:
00h - обычный файл;
01h - только читаемый файл;
02h - скрытый файл;
04h - системный файл
DS:DX Адрес блока памяти, в который функция запишет путь созданного временного файла. Размер этого блока памяти должен быть по крайней мере 13 байт
На выходе: AX Код ошибки, если был установлен флаг переноса CF;
Идентификатор файла, если флаг переноса CF сброшен

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

Открытие файла

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

На входе: AH 3Dh
AL Требуемый режим доступа:

Бит 7: флаг наследования

0 - идентификатор файла наследуется порожденным процессом
1 - идентификатор файла не наследуется порожденным процессом

Биты 4...6: режим разделения

000 - режим совместимости
001 - запрещение всех видов доступа
010 - запрещение записи
011 - запрещение чтения
100 - разрешение всех видов доступа

Бит 3:0 - зарезервировано

Биты 0...2: вид доступа

000 - чтение
001 - запись
010 - чтение и запись
DS:DX Адрес строки, содержащей путь к файлу
На выходе: AX Код ошибки, если установлен флаг переноса CF;
Идентификатор файла, если флаг переноса CF сброшен

С помощью функции 3Dh можно открыть любой файл (но не каталог). Если требуется вид доступа "запись", открываемый файл не должен иметь атрибут "Только читаемый".

Для использования битов 4...7 (управляющих доступом к файлу другими программами в сети) должна быть запущена программа share.exe .

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

Функция 6Ch обладает расширенными возможностями по созданию и открытию файлов:

На входе: AH 6Ch
AL 00h
BX Байт флагов расширенного режима открытия файла
CX Атрибуты создаваемого файла, используется только при создании файлов
DX Выполняемая функция, если файл существует или не существует:

Биты 0-3 регистра DX задают действие, если файл существует:

0000h - если файл существует, вернуть признак ошибки;
0001h - если файл существует, открыть его;
0002h - если файл существует, заместить и открыть его.

Биты 4-7 регистра DX задают действие, если файл не существует:

0000h - если файл не существует, вернуть признак ошибки;
0001h - если файл не существует, создать и открыть его
DS:SI Адрес строки, содержащей путь к файлу
На выходе: AX Код ошибки, если флаг переноса CF установлен;
Идентификатор файла, если флаг переноса CF сброшен
CX Код выполненных действий:
0 - файл был открыт;
1 - файл был создан и открыт;
2 - файл был замещен и открыт

Регистр BX на входе задает флаги расширенного режима открытия файла в следующем формате:

Биты Назначение
0...2 Режим доступа при чтении или записи
3 Зарезервировано, должно быть равно 0
4...6 Режим разделения
7 Флаг наследования
8...12 Зарезервировано, должно быть равно 0
13 0 - Режим обычного использования обработчика критических ошибок INT 24h (обработчик критических ошибок будет описан позже)
1 - Блокировка обработчика критических ошибок INT 24h. Для того, чтобы узнать причину ошибки, программа должна использовать функцию 59h прерывания INT 21h
14 Управление буферизацией:
0 - Использование стандартной для MS-DOS буферизации;
1 - Отмена буферизации. Использование этого режима замедлит работу с диском, однако вероятность потери информации при аварии в питающей сети уменьшится

Описанная выше функция является как бы комбинацией функций 3Dh и 3Ch (открытие и создание файла). Она удобна, но при ее использовании программа должна убедиться в том, что версия MS-DOS не ниже, чем 4.0.

Удаление файла

Удалить файл можно при помощи функции 41h прерывания INT 21h :

На входе: AH 41h
DS:DX Адрес строки в формате ASCIIZ, содержащей путь удаляемого файла
На выходе: AL Код ошибки, если установлен флаг переноса CF

С помощью этой функции нельзя удалить файл, имеющий атрибут "Только читаемый".

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

Переименование или перемещение файла

Программа может изменить имя файла или переместить его в другой каталог того же самого диска, воспользовавшись функцией 56h прерывания INT 21h :

На входе: AH 56h
DS:DX Адрес строки в формате ASCIIZ, содержащей старое имя
ES:DI Адрес строки в формате ASCIIZ, содержащей новое имя или новый путь к файлу
На выходе: AL Код ошибки, если установлен флаг переноса CF

С помощью этой функции можно переименовать (но не переместить) не только файл, но и каталог.

Функции библиотеки Borland C++

Стандартная библиотека Borland C++ содержит функции для работы с файлами. Эти функции можно разделить на две группы - функции низкого уровня и функции ввода/вывода потоком. Вторая группа функций использует буферизацию и будет рассмотрена в разделе, посвященном буферизованному вводу/выводу.

Функции низкого уровня отображаются на описанные выше функции прерывания INT 21h (а также на функции этого же прерывания, предназначенные для чтения или записи, позиционирования и т. д.).

creat

Для создания файла можно использовать функцию creat :

int creat (char *filename, int mode);

Эта функция и ее параметры описаны в файлах io.h, sys\types.h, sys\stat.h, errno.h.

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

Второй параметр позволяет задать атрибуты создаваемого файла. Он может иметь следующие значения:

Параметр Операции, разрешенные для создаваемого файла
S_IWRITE Запись
S_IREAD Чтение
S_IREAD | S_IWRITE Чтение и запись

В операционной системе MS-DOS невозможно создать файл, в который можно было бы писать, но из которого было бы нельзя читать информацию. Поэтому если указать второй параметр как S_IWRITE, будет создан такой файл, для которого разрешены как операция записи, так и операция чтения.

После создания файла функция creat открывает новый файл, возвращая идентификатор файла или код ошибки.

open

Мощная функция open предназначена как для открытия существующих файлов, так и для создания новых:

int open (char *filename, int oflag [, int pmode]);

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

Параметр oflag может являться результатом логической операции ИЛИ над следующими константами, определенными в файле fcntl.h:

Константа Описание
O_APPEND При записи в файл информация будет добавляться в конец файла
O_BINARY Файл открывается для работы в двоичном режиме (игнорируются управляющие символы, такие как конец строки)
O_CREAT Создается новый файл и открывается для записи. Эта константа игнорируется, если указанный в первом параметре файл уже существует
O_EXCL Используется вместе с O_CREAT . Если указанный в первом параметре файл существует, функция возвратит признак ошибки
O_RDONLY Файл открывается только для чтения, попытка записи в файл приведет к тому, что функция записи вернет признак ошибки
O_RDWR Файл открывается как для чтения, так и для записи
O_TEXT Файл открывается в текстовом режиме
O_TRUNC Существующий файл открывается и обрезается до нулевой длины (если для этого файла разрешена операция записи)
O_WRONLY Файл открывается только для записи (в MS-DOS для файла, открытого с признаком O_WRONLY , разрешено выполнение операции чтения)

close

Для того, чтобы закрыть файл, открытый функциями creat или open , нужно использовать функцию close :

int close (int handle);

В качестве параметра функции передается идентификатор файла, полученный при открытии или создании файла. Функция возвращает 0 при успешном закрытии файла или -1 при ошибке.

Коды ошибок

Код ошибки для этой и других функций стандартной библиотеки Borland C++ записывается в глобальную переменную errno.

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