Организация поиска файлов и каталогов
В языке 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;