Атрибуты файла. Поиск файла

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

Файлы имеют специальные атрибуты. Атрибут – это свойство, которое файл проявляет в зависимости от его установки. Например, если файл имеет атрибут “только чтение”, он может читаться, но его нельзя обновить или уничтожить. Каждый файл имеет байт атрибутов, используемый для сохранения настроек атрибутов.

Когда с файлом осуществляется работа как с потоком данных, используются дескриптор файлов. Дескриптор представляет собой число целого типа, установленное операционной системой для конкретного файла. Для того чтобы отличить дескриптор от других целых чисел, введен специальный тип THandle.

Запись, обеспечивающая хранение характеристик файла после удачного поиска, выглядит следующим образом:

type

TFileName = string;

TSearchRec = record

Time: Integer; {Время и дата создания}

Size: Integer; (Размер файла}

Attr: Integer; {Параметры файла}

Name: TFileName; {Полное имя файла}

ExcludeAttr: Integer; {He используется}

FindHandle: THandle; {Дескриптор файла}

FindData: TWin32FindData; (He используется}

end;

Для получения или установки параметров файла (имя, дата и время создания, атрибуты и другие) используется переменная типа TSearchRec, описанная выше.

Дата и время создания файла хранятся в формате MSDOS, поэтому для получения этих параметров в принятом в Delphi формате TDateTime необходимо использовать следующую функцию:

function FileDateToDateTime(FileDate: Integer): TDateTime;

Обратное преобразование выполняет функция

function DateTimeToFileDate(DateTime: TDateTime): Integer;

Свойство Attr может содержать комбинацию следующих поименованных констант:

· faReadOnly —только для чтения;

· faHidden —скрытый;

· faSysFile — системный;

· faVolumeID — метка тома;

· faDirectory — каталог;

· faArchive — архивный;

· faAnyFile — любой.

Для определения параметров файла используется оператор and.

Пример:

В этом примере осуществляется логическое умножение поля Attr переменной типа TSearchRec с константой faReadOnly.

if (SearchRec.Attr and faReadOnly) > 0

then ShowMessage('Файл только для чтения');

Непосредственно для поиска файлов используются функции FindFirst и FindNext.

Функция FindFirst имеет следующий синтаксис:

function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec):Integer;

Она находит первый файл, заданный полным маршрутом Path и параметрами Attr. Если заданный файл найден, функция возвращает 0, иначе — код ошибки Windows. Параметры найденного файла возвращаются в записи F типа TSearchRec.

Функция

function FindNext(var F: TSearchRec): Integer;

используется для повторного поиска следующего файла, удовлетворяющего критерию поиска. При этом используются те параметры поиска, которые заданы последним вызовом функции FindFirst. В случае удачного поиска возвращается 0.

Для завершения процесса поиска, применяется функция:

procedure FindClose(var F: TSearchRec);

Подпрограммы FindFirst, FindNext и FindClose используются совместно. Функция FindFirst начинает процесс поиска файлов, в ней задаются путь для поиска и атрибуты искомого файлов. Функция FindNext, начинает поиск следующего файла, удовлетворяющего заданным свойствам. Процедура FindClose завершает процесс поиска.

Пример:

В этом примере осуществляется поиск архивных файлов в заданном каталоге (в корне диска C:). В случае успешного поиска в компонент Label1 выводится название найденного файла и его размер в байтах.

procedure TForm1.Button1Click(Sender: TObject);

label L1;

var

SR:TSearchRec;

begin

if FindFirst('C:\*.*', faArchive,SR)=0 then

begin

Label1.Caption:= SR.Name+' - '+IntToStr(SR.Size);

L1: if MessageDlg('Искать далее?',mtConfirmation, [mbYes,mbNo],0)

=mrYes then

if FindNext(SR) = 0 then

begin

Label1.Caption:= SR.Name+' - '+IntToStr(SR.Size);

goto L1;

end;

end;

FindClose(SR);

MessageDlg('Поиск прекращен',mtConfirmation,[mbOK],0);

end;

Пример:

В следующем примере маршрут поиска архивных и скрытых файлов задается в однострочном текстовом редакторе DirEdit, а список найденных файлов передается в компонент TListBox.

procedure TFormI.FindBtnClick(Sender: TObject);

begin

ListBox.Items.Clear;

FindFirst(DirEdit.Text, faArchive + faHidden, SearchRec);

while FindNext(SearchRec) = 0 do

ListBox.Items.Add(SearchRec.Name) ;

FindClose(SearchRec);

end;