Организация поиска файлов и каталогов

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

 

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

 

В первом аргументе метода необходимо указать каталог, где будет осуществляться поиск, и маску поиска. Например, маска ‘C:\Mydir\*.txt’ задает поиск всех файлов с расширением txt в каталоге ‘C:\Mydir’. Второй аргумент определяет атрибуты искомых файлов (см. табл. 4.5). Один файл может обладать одним и более атрибутами.

Если файл успешно найден, функция вернет нулевое значение, а данные о найденном файле окажутся в переменной F типа TSearchRec.

 

Type

TSearchRec = recordTime:

Integer; //дата файла

Integer; //размер в байтах

Attr: Integer; //атрибуты файла

Name: TFileName; //имя файла

ExcludeAttr: Integer; //не документировано

FindHandle: THandle; //дескриптор файла

FindData: TWin32FindData; //структура Win API с дополнительной информацией

end;

Вторая функция FindNext() является логическим продолжением метода FindFirst(). Задача метода – поиск оставшихся файлов. При нахождении файла функция возвращает нулевое значение и записывает данные в переменную F.

 

functionFindNext(var F: TSearchRec): Integer;

 

По завершении поиска метод FindClose() обязан освободить использованные ресурсы:

 

procedure FindClose(var F: TSearchRec);

 

Теперь обратимся к примеру, демонстрирующему способ сбора данных обо всех файлах и каталогах, размещенных в корне диска C:\. Поиск данных осуществляется в цикле до тех пор, пока метод FindNext() не вернет отличное от нуля значение.

 

var F : TSearchRec;

Begin

ifFindFirst('c:\*.*',faAnyFile,F)=0 then

Repeat

if (F.Attr and faDirectory) <> 0 then //если это каталог, то отобразим только имя

WriteLn(F.Name)

else//это файл, выводим более подробную информацию

WriteLn(F.Name,#9,F.Size,#9,DateTimeToStr(FileDateToDateTime(F.Time)));

until FindNext(F)<>0;

FindClose(f);

ReadLn;

End.

При организации поиска стоит обратить внимание на некоторые особенности проверки принадлежности определенного атрибута набору атрибутов найденного файла. Для этого мы выясняем результат комбинации атрибутов файла и нашего атрибута при помощи оператора and: (F.Attr and faDirectory) <>0. Если возвращено ненулевое значение, то атрибут входит в набор. Говоря о поиске, стоит упомянуть еще один метод, проверяющий перечень путей к искомому файлу и выбирающий верный:

 

function FileSearch (const Name, DirList: string): string;

 

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

 

FilePath:=FileSearch('comctl32.dll','C:\;C:\Windows;C:\Windows\System');

 








Дата добавления: 2016-03-15; просмотров: 664;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.006 сек.