Удаление файлов и пустых каталогов

Функции удаления возвращают логическое значение 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.

Наши рекомендации