Файлы в системе 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 | Изменение имени текущего каталога |
