• FILE_ATTRIBUTE_HIDDEN – скрытый файл или каталог;
• FILE_ATTRIBUTE_NORMAL – означает отсутствие особых атрибутов у файла или каталога (у последнего, естественно, всегда установлен атрибут FILE_ ATTRIBUTE_DIRECTORY);
• FILE_ATTRIBUTE_READONLY – файл или каталог только для чтения;
• FILE_ATTRIBUTE_SYSTEM – системный файл или каталог;
• FILE_ATTRIBUTE_TEMPORARY – временный файл (файловая система стремится по возможности хранить все содержимое открытого временного файла в памяти для ускорения доступа к находящимся в нем данным).
Были рассмотрены основные атрибуты, которые могут быть присвоены объектам файловой системы (файлам и папкам), но не было сказано, как получить или установить атрибуты файла или каталога. Атрибуты можно получить при просмотре содержимого каталога (как в рассмотренных далее функциях поиска). А можно использовать для этого API-функцию GetFileAttributes. Она принимает путь файла (PChar) и возвращает значение типа DWORD (32-битное целое значение), представляющее собой битовую маску. Если функция GetFileAttributes завершается неудачно, то возвращаемое значение равно $FFFFFFFF (-1 при переводе к беззнаковому целому).
Каждому из рассмотренных атрибутов соответствует бит в возвращаемом функцией GetFileAttributes значении. Вот отрывок программы, определяющей, является ли файл системным:
...
var attrs: DWORD;
begin
attrs := GetFileAttribute(PAnsiChar(\'C:\boot.ini\'));
if (attrs and FILE_ATTRIBUTE_SYSTEM <> 0) then {файл системный};
Атрибуты устанавливаются при помощи API-функции SetFileAttributes. Она принимает два параметра: путь файла или папки (PChar) и битовую маску атрибутов. Возвращает 0 (False) в случае неудачи и ненулевое значение в противном случае.
Поскольку в функцию SetFileAttributes передается маска, хранящая сведения сразу обо всех атрибутах файла или папки, то изменять атрибуты нужно аккуратно (чтобы не удалить установленные ранее). Пример (отрывок программы) «включения» одного и одновременного «выключения» другого атрибута файла приведен в листинге 4.22 (проверка ошибок для простоты не производится).
...
Листинг 4.22.
Изменение атрибутов файла
var attrs: DWORD;
begin
attrs := GetFileAttributes(\'C:\text.txt\');
attrs := attrs or FILE_ATTRIBUTE_HIDDEN; //Установка атрибута «скрытый»
attrs := attrs and not FILE_ATTRIBUTE_ARCHIVE; //Снятие атрибута «архивный»
SetFileAttributes(\'C:\text.txt\', attrs);
Поиск в указанной папке
Поиск в пределах одной папки представляет собой простой перебор всех элементов каталога с отбором тех, имена которых удовлетворяют маске и заданному набору атрибутов. В приведенном ниже примере (листинг4.23) используется API-функция FindFirstFile, которая начинает просмотр заданного каталога, автоматически отсеивая имена файлов и папок, не удовлетворяющи х маске. Функция возвращает дескриптор (THandle), используемый для идентификации начатого просмотра папки при продолжении поиска (в функции FindNextFile).
После окончания просмотра папки вызывается функция FindClose, завершающая просмотр папки. Очень напоминает работу с обычным файлом (открытие, просмотр, закрытие), не так ли?
...
Листинг 4.23.
Поиск в заданной папке
function SearchInFolder(folder, mask: String; flags: DWORD;
names: TStrings; addpath: Boolean = False): Boolean;
var
hSearch: THandle;
FindData: WIN32_FIND_DATA;
strSearchPath: String;
bRes: Boolean; //Если равен True, то нашли хотя бы один
//файл или каталог
begin
strSearchPath := folder + \'\\' + mask;
bRes := False;
//Начинаем поиск
hSearch := FindFirstFile(PAnsiChar(strSearchPath), FindData);
if (hSearch <> INVALID_HANDLE_VALUE) then
begin
//Ищем все похожие элементы (информация о первом элементе
//уже записана в FindData функцией FindFirstFile)
repeat
if (String(FindData.cFileName) <> \'..\') and
(String(FindData.cFileName) <> \'.\') then
//Пропускаем . и ..
begin
if MatchAttrs(flags, FindData.dwFileAttributes) then
begin
//Нашли подходящий объект
if addpath then
names.Add(folder + \'\\' + FindData.cFileName)
else
names.Add(FindData.cFileName);
bRes := True;
end;
end;
until FindNextFile(hSearch, FindData) = False;
//Заканчиваем поиск
FindClose(hSearch);
end;
SearchInFolder := bRes;
end;
Результатом работы функции SearchlnFolder является заполнение списка names именами или, если значение параметра addpath равно True, полными путями найденных файлов и каталогов. Значение параметра flags (битовая маска атрибутов) формируется так же, как для функции SetFileAttributes. Только одновременно можно установить любые интересующие программиста атрибуты. При нахождении хотя бы одного файла или каталога SearchlnFolder возвращает значение True.
Читать дальше
Конец ознакомительного отрывка
Купить книгу