Пропустить навигацию.
Главная

Файлы в системе Borland C++ Builder

Двоичные файлы, уже существующие на диске, в BCB принято открывать с помощью функции _rtl_open, которая заменяет устаревшую функцию _open:

nf = _rtl_open(*filename, flags);

Ее первый параметр является указателем типа char * на строку с именем открываемого файла или явно содержит эту строку. При явном задании имени файла с полным путем не забывайте вместо символа \ набирать два символа \\. В качестве второго аргумента используют одну из мнемонических констант O_RDONLY, O_WRONLY или O_RDWR, определяющих режим использования файла (для чтения, для записи, для чтения и записи).

Функция _rtl_open возвращает целое число nf, заменяющее имя файла в последующих операциях обмена. Иногда его называют дескриптором файла (в англоязычной документации — file handle), но мы предпочитаем более простое обозначение — номер файла. Ошибка при открывании файла может быть вызвана указанием несуществующего пути, попыткой открыть файл, используемый в данное время другой программой, или неверным заданием режима. В этом случае возвращаемое значение равно -1.

Для создания нового двоичного файла или использования существующего с уничтожением содержащихся в нем данных используется функция _rtl_creat:

nf = _rtl_creat(*filename, attrib);

Ее второй аргумент определяет такие атрибуты файла как только для чтения (константа _A_RDONLY), скрытый (константа _A_HIDDEN), системный (константа _A_SYSTEM), нормальный (константа _A_NORMAL), подлежащий архивации (константа _A_ARCH). При необходимости присвоить файлу несколько атрибутов одновременно, следует написать логическую сумму таких констант, например — _A_RDONLY OR _A_HIDDEN. Указанные мнемонические константы находятся в том же заголовочном файле io.h, где находятся и прототипы функций _rtl_open, _rtl_creat, _rtl_close, _rtl_write и _rtl_read. Создаваемый таким образом файл доступен и для записи, и для чтения.

Запись в двоичный файл осуществляется с помощью функции _rtl_write, которая заменила устаревшую функцию _write:

int _rtl_write(int nf, void *buf, unsigned len);

Первым ее аргументом является номер файла. Информация, которая должна быть записана на диск, готовится в массиве оперативной памяти, на который «смотрит» указатель buf, а длина этого массива в байтах задается третьим параметром len. Значение, возвращаемое функцией, определяет количество успешно записанных байтов. Как правило, оно должно совпадать с заказанной длиной len. Меньшее значение, свидетельствует об ошибке, скорее всего — о переполнении диска.

Функция извлечения данных из двоичного файла имеет очень похожий формат и аргументы у нее те же самые:

int _rtl_read(int nf, void *buf, unsigned len);

Она заменила устаревшую функцию _read. Если возвращаемое значение меньше, чем запрашиваемое количество байт (len), то программа прочитала последнюю порцию данных. И после этого функция возвратит только нулевое значение.

Наряду с новыми функциями, описанными выше, в заголовочном файле io.h находятся заголовки ранее эксплуатировавшихся функций — open, creat, creatnew, creattmp, с помощью которых можно открыть или создать файлы в текстовом или двоичном режиме:

nf = open(*filename, access[,mode]);

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

  • O_RDONLY — файл открывается только для чтения;
  • O_WRONLY — файл открывается только для записи;
  • O_RDWR — файл открывается для записи и чтения;
  • O_APPEND — открывается существующий файл для пополнения имеющегося в нем набора данных (при открытии такого файла его указатель устанавливается вслед за последней существующей записью);
  • O_CREAT — используется для создания нового или открытия существующего файла;
  • O_TRUNC — позволяет удалить данные в существующем файле;
  • O_BINARY — открываемый файл будет работать в двоичном режиме;
  • O_TEXT — открываемый файл будет работать в текстовом режиме.

Необязательный третий аргумент может принимать одно из трех следующих значений — S_IREAD, S_IWRITE или S_IREAD|S_IWRITE. Он определяет направление обмена. Вообще говоря, текстовый или двоичный файл может быть открыт и без указания режима во втором параметре. Дело в том, что в файле io.h объявлена глобальная переменная _fmode, значением которой по умолчанию является константа O_TEXT. Она и оказывает влияние на тип открываемого файла, если признак O_TEXT или O_BINARY опущен при открытии или создании файла.

Функция creat создает новый или открывает существующий файл. В отличие от этого функция creatnew сообщает об ошибке при попытке создать уже существующий файл. Функция creattmp позволяет создать временный файл в указанном каталоге. Для временного файла система сама формирует уникальное имя и удаляет файл после его закрытия. Все три функции создают текстовый или двоичный файл в зависимости от значения глобальной переменной _fmode. Функции open и creat возвращают целочисленный номер открытого файла или выдают значение -1, если попытка открыть файл не удалась.

Форматы вызова функций write и read полностью совпадают с обращениями к функциям _rtl_write и _rtl_read.

Для перемещения указателя двоичного файла с номером nf в нужную позицию предназначена функция lseek:

k=long lseek(nf, offset, fromwhere);

Позиция (номер байта), в которую следует переместить указатель файла, определяется как заданное целочисленное смещение offset относительно одной из трех точек:

  • относительно текущей позиции указателя, если третий аргумент равен SEEK_CUR. В этом случае смещение может быть как положительным, так и отрицательным;
  • относительно начала файла, если третий аргумент равен SEEK_SET. В этом случае смещение должно быть положительным;
  • относительно конца файла, если третий аргумент равен SEEK_END. В этом случае смещение должно быть отрицательным.

Система BCB предлагает довольно большой набор функций по управлению файлами и каталогами, реализуемых в конечном итоге через процедуры Windows. Их перечень приведен в табл. 7.1 без указания формата их вызова. Как правило, имена файлов и каталогов среди параметров этих процедур имеют тип AnsiString. При желании вы можете сами заглянуть в файл помощи и получить нужную справку. Таблица 7.1 лишь дает представление о функциональных возможностях системных процедур.

Таблица 7.1

Функция Назначение
CreateDir Создание нового каталога
DeleteFile Удаление файла с диска
DirectoryExists Определение, существует ли указанный каталог
DiskFree Определение размера свободного места на указанном диске
DiskSize Определение полного объема указанного диска
FileAge Определение даты и времени создания или последнего обновления указанного файла
FileClose Закрытие указанного файла
FileDateToDateTime Преобразование даты и времени создания файла в значение типа TDateTime
FileExists Определение, существует ли указанный файл
FileGetAttr Опрос атрибутов указанного файла
FileGetDate Опрос даты и времени создания файла в формате MS-DOS
FileOpen Открывание файла с указанным режимом доступа
FileRead Чтение указанного числа байтов из файла
FileSearch Поиск полного пути к указанному файлу
FileSeek Перемещение указателя в открытом файле
FileSetAttr Установка атрибутов файла
FileSetDate Изменение даты и времени создания файла в формате MS-DOS
FileWrite Запись содержимого буфера в файл, начиная с текущей позиции
FindClose Освобождение памяти, занятой процедурой FindFirst
FindFirst Поиск первого файла с заданными атрибутами в указанном каталоге
FindNext Поиск следующего файла с заданными атрибутами в указанном каталоге
ForceDirectories Создание всех каталогов, соответствующих заданному пути
GetCurrentDir Опрос имени текущего каталога
RemoveDir Удаление существующего пустого каталога
RenameFile Изменение имени файла
SetCurrentDir Изменение имени текущего каталога