Удаление файлов и пустых каталогов
Функции удаления возвращают логическое значение true, если удаление состоялось, и false в случае отказа от операции (например, нельзя удалять не пустые каталоги, файлы с атрибутом Read-Only или несуществующие файлы).
bv = DeleteFile(FileName);
bv = RemoveDir(DirName);
Под управлением MS-DOS для удаления файла можно было воспользоваться функцией unlink:
k=unlink(const char *filename); //k=0, если файл удален
Создание каталога
Новый каталог создается с помощью функции CreateDir:
bv = CreateDir(DirName);
Если каталог создан, то возвращаемое значение равно true.
Переименование файла
Для замены имени файла используется функция RenameFile:
bv = FileRename(OldName,NewName);
Если переименование состоялось, то возвращаемое значение равно true.
Изменение расширения
Новое расширение (Extension) заменяет прежнее расширение в имени файла, если обратиться к функции ChangeExt:
as = ChangeFileExt(FileName, Extension);
При этом прежний файл и его содержимое сохраняется со своим старым именем. Создается новое имя файла (as), имеющее новое расширение.
Точно такой же функции в системе MS-DOS нет, но там можно было бы разложить спецификацию файла на составляющие (функция fnsplit) и заново собрать компоненты, подменив расширение файла (функция fnmerge).
Опрос атрибутов файла
Функция FileGetAttr позволяет узнать атрибуты файла, которые выдаются как двоичные разряды в возвращаемом значении:
int k = FileGetAttr(FileName);
В таблице 11.2 приведены значения отдельных флажков.
Таблица 11.2
Флажок | Значение | Пояснение |
faReadOnly | 0x01 | признак "Только для чтения" |
faHidden | 0x02 | скрытый файл |
faSysFile | 0x04 | системный файл |
faVolumeId | 0x08 | признак "Идентификатор тома" |
faDirectory | 0x10 | признак "Каталог" |
faArchive | 0x20 | архивируемый файл |
faAnyFile | 0x3F | суммарный набор признаков |
Для проверки тог или иного признака можно воспользоваться указанными константами:
if(k & faHidden)... //если файл скрытый
Установка атрибутов файла
Для установки новых атрибутов используется функция FileSetAttr:
k = FileSetAttr(FileName,Attr);
Второй аргумент задается как логическая сумма флажков, приведенных в табл. 11.2:
Attr = faReadOnly | faSysFile;
Опрос и изменение текущего каталога
Текущий каталог – это каталог, из которого запущена программа. Если файлы используемые программой находятся в текущем каталоге, то во всех файловых процедурах можно указывать только короткое имя файла. Если файл находится в другом каталоге, то приходится задавать полную спецификацию файла. Для сокращения можно изменить имя текущего каталога, чтобы избежать задания полных путей. Система BCB предлагает две функции, с помощью которых можно узнать или изменить имя текущего каталога:
as = GetCurrentDir(); //опрос имени текущего каталога
vb = SetCurrentDir(NameDir); //смена текущего каталога
Поиск файлов в каталогах
Одной из довольно распространенных процедур является составление списка файлов указанного каталога, имена которых удовлетворяют заданной маске. Под управлением MS-DOS такая задача решается с помощью функций findfirst (найти первый файл) и findnext (найти следующий файл). Обе функции используют в качестве одного из своих аргументов адрес структуры типа ffblk, в которую они заносят информацию о найденном файле:
struct ffblk {
char ff_reserved[21]; //зарезервировано для MS-DOS
char ff_attrib; //байт атрибутов найденного файла
int ff_time; //время создания/модификации файла
int ff_date; //дата создания/модификации файла
long ff_size; //размер файла
char ff_name[13]; //имя найденного файла
};
Описание этой структуры и прототипы указанных функций находятся в заголовочном файле dir.h. Обе функции возвращают нулевое значение, если поиск закончился удачно. Достаточно четкое представление об их использовании дает следующий пример, который выводит на экран список всех файлов с расширением .cpp из каталога c:\bc\bin:
#include <stdio.h>
#include <conio.h>
#include <dir.h>
void main()
{ struct ffblk qq;
int a;
printf("Список файлов *.cpp\n");
a=findfirst("c:\\bc\\bin\\*.cpp",&qq,0); //поиск первого файла
while(!a)
{ printf(" %s\n",qq.ff_name);
a=findnext(&qq); //поиск следующего файла
}
getch();
}
Первый аргумент функции findfirst определяет маску, которой должно удовлетворять имя искомого файла. Третий аргумент этой функции имеет тип int и позволяет фильтровать найденные объекты по любой комбинации их атрибутов в файловой системе (Read Only, Hidden, System, Archive, Volume, Directory). Нулевое значение этого параметра, использованное в примере, игнорирует отбор по атрибутам.
Точно таким же способом можно осуществлять поиск нужных файлов в среде BCB.