Функція FindFirst.

Синтаксис:

FindFirst
(КАТАЛОГ_ПОИСКА_И_МАСКА_ФАЙЛА,
АТРІБУТИ_ІСКОМОГО_ФАЙЛА, ПОІСКОВОЯ_ПЕРЕМЕННАЯ);

де: Каталог для пошуку і маска шуканого елемента – строкова величина,
що має тип String, може, наприклад, утримувати "c :*.*" – всі елементи в корені
диска С. Зверніть увагу, що вказується повний шлях для пошуку.

Атрибути шуканого елемента це для користувача або системні атрибути,
які може мати файл (каталог, мітка диска). Ось їх перелік:


Ці вам потрібно шукати тільки елементи, що мають атрибут "каталог" і "прихований",
то можна застосувати знак математичного складання, наприклад faDirectory +
faHidden.

Пошукова змінна має тип TSearchRec. У неї, при успішному результаті
пошуку, буде занесено всі необхідні дані про знайдений файловому елементі.

Оскільки FindFirst є функцією, то вона повинна сама повертати
деяке значення. Це значення має тип Integer і означає результат пошуку
файлу (код помилки пошуку). Якщо файл знайдений, то приймає нульове значення.

Функція FindNext.

 FindNext (ПОІСКОВАЯ_ПЕРЕМЕННАЯ);

Ця функція продовжує пошук, заданий у функції FindNext. Повертає
значення результату пошуку (нульове у разі успішного пошуку).

Процедура FindClose.

 FindClose (ПОІСКОВАЯ_ПЕРЕМЕННАЯ);

Закриває пошук і звільняє пам'ять, виділену системою під пошук.

Тепер розглянемо приклад. Припустимо, нам треба знайти всі файли і каталоги в
каталозі DELPHI, що знаходиться на диску C:. Надалі, ви можете
самостійно, змінюючи маску, змінювати умови пошуку. Для форми з компонентом
ListBox1 і кнопкою Button1 реакція на OnClick по кнопці:

procedure TForm1.Button1Click(Sender: TObject);
Var SR: TSearchRec; / / Пошукова мінлива
FindRes: Integer; / / мінлива для запису результату пошуку
begin
ListBox1.Clear; / / очищення компонента ListBox1 перед занесенням до нього списку файлів

/ / Завдання умов пошуку і початок пошуку
FindRes:=FindFirst(“c:delphi*.*”,faAnyFile,SR);

While FindRes = 0 do / / поки ми знаходимо файли (каталоги), то виконувати цикл
begin
ListBox1.Items.Add (SR.Name); / / додавання до списку назву знайденого елемента
FindRes: = FindNext (SR); / / продовження пошуку по заданих умовах
end;
FindClose (SR); / / закриваємо пошук
end;


Представлений приклад коду, в принципі, є основою для організації
більш поглибленого пошуку, пошуку файлів за часом створення, за що містяться
словами. Якщо ви запустите цю програму на виконання, то при натисканні на кнопку
Button1 ви побачите в списку в першій і другій рядку елементи "." і "..". Це
елементи, що мають атрибут "каталог". Перший містить зв'язок з кореневим каталогом
диска, другий містить зв'язок до каталогом верхнього рівня. З другим ви
зустрічаєтеся в дискових командних оболонках, наприклад нортон, коли вибираєте
каталог ".." і натискаєте на "вхід". Тим самим ви потрапляєте в каталог на рівень
вище. Природно, у пошуковій програмі такі елементи не треба вносити в
список, тому ми ігноруємо їх знаходження. Виправляємо процедуру натискання на
кнопку Button1:

procedure TForm1.Button1Click(Sender: TObject);
Var SR:TSearchRec;
FindRes:Integer;
begin
ListBox1.Clear;

FindRes:=FindFirst(“c:delphi*.*”,faAnyFile,SR);
While FindRes=0 do
begin
/ / Якщо знайдений елемент каталог та
if ((SR.Attr and faDirectory)=faDirectory) and
/ / Він має назву "." або "..", тоді:
((SR.Name=”.”)or(SR.Name=”..”)) then
begin
FindRes: = FindNext (SR); / / продовжити пошук
Continue; / / продовжити цикл
end;

ListBox1.Items.Add(SR.Name);
FindRes:=FindNext(SR);
end;
FindClose(SR);
end;


У цьому випадку, при знаходженні каталогу з ім'ям "." або з ім'ям ".."
програма продовжить обробку циклу пошуку без виведення знайденого імені елемента
в компонент списку ListBox1.

Тепер розглянемо тип TSearchRec. Він має у собі кілька корисних властивостей:


Всі перераховані вище властивості ми вже розглянули або вони зрозумілі відразу, за
винятком властивості Time. Воно має тип Integer і містить в собі упаковане
значення дати і часу створення файлів. Розпакування проводиться за допомогою
функції FileDateToDateTime, яка в результаті повертає значення дати і
часу.

Тепер додамо в нашу форму компонент DateTimePicher1 (сторінка Win32) і
допишемо кілька рядків.

procedure TForm1.Button1Click(Sender: TObject);
Var SR:TSearchRec;
FindRes:Integer;
begin
ListBox1.Clear;

FindRes:=FindFirst(“c:delphi*.*”,faAnyFile,SR);
While FindRes=0 do
begin
if ((SR.Attr and faDirectory)=faDirectory) and
((SR.Name=”.”)or(SR.Name=”..”)) then
begin
FindRes:=FindNext(SR);
Continue;
end;
/ / Якщо у файлу (каталогу) дата створення менше,
/ / Чим встановлено в DateTimePicker1, то
if FileDateToDateTime (SR.Time) <DateTimePicker1.Date then
begin
FindRes: = FindNext (SR); / / продовжити пошук
Continue; / / продовжити цикл
end;

ListBox1.Items.Add(SR.Name);
FindRes:=FindNext(SR);
end;
FindClose(SR);
end;


Як ви вже помітили, ми відбираємо файли і каталоги за датою створення, починаючи з
зазначеної в компоненті DateTimePicker1.

Тепер спробуємо організувати пошук файлів у всіх вкладених каталогах. Це
не так просто, як може здатися на перший погляд. Нам доведеться вручну
організовувати весь цикл входу-виходу з каталогу, перебір файлів. Трохи
важкувато матеріал, але можливо ті з вас, хто вже працював з мовою
програмування pascal або іншим, знайомі з технологією багатократності і
многовложенності використання одного і того ж програмного коду. Коротко
поясню алгоритм роботи такої програми.


Таким чином, скільки витків програма намотує на так званий клубок,
стільки витків вона і розмотати. Програма на виконанні проходить все дерево
вкладених каталогів, виконуючи один і той же шматок програмного коду! І при цьому
дані умов пошуку не переплутуються, і для кожної унікальної процедури вони
зберігаються.

Розглянемо приклад. Створіть новий проект. Для створення окремої процедури
пошуку нам потрібно оголосити її у відповідному розділі (створюємо її вручну,
тому і самостійно оголошуємо).

У розділі public пишемо рядок:

procedure FindFile(Dir:String);

А в розділі коду програми, до слова "end." вставляємо порожній каркас процедури

procedure TForm1.FindFile(Dir:String);
begin

end;


На форму вставляємо компонент списку ListBox1, Button1, Edit1. Для компонента
Edit1 властивість Text встановлюємо в "c: delphi". Зверніть увагу на останній
символ, знак "", присутність якого в початковому шляху пошуку обов'язково.
Далі процедура OnClick для кнопки Button1 виглядає наступним чином:

procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Clear; / / очищення списку файлів
FindFile (Edit1.Text); / / пошук файлів з початковими умовами, заданих в Edit1
end;

Створена нами вручну процедура пошуку:

procedure TForm1.FindFile(Dir:String);
Var SR:TSearchRec;
FindRes:Integer;
begin
FindRes:=FindFirst(Dir+”*.*”,faAnyFile,SR);
While FindRes=0 do
begin
if ((SR.Attr and faDirectory)=faDirectory) and
((SR.Name=”.”)or(SR.Name=”..”)) then
begin
FindRes:=FindNext(SR);
Continue;
end;

/ / Якщо знайдений каталог, то
if ((SR.Attr and faDirectory)=faDirectory) then
begin
/ / Входимо в процедуру пошуку з параметрами поточного каталогу +
/ / Каталог, що ми знайшли
FindFile(Dir+SR.Name+””);
FindRes:=FindNext(SR);
/ / Після огляду вкладеного каталогу ми продовжуємо пошук
/ / У цьому каталозі
Continue; / / продовжити цикл
end;

ListBox1.Items.Add(SR.Name);
FindRes:=FindNext(SR);
end;
FindClose(SR);
end;


Якщо ви в компоненті Edit1 в якості початкової умови пошуку файлів
задасте кореневу папку диска, наприклад "С:", то ви отримаєте повний перелік
всіх файлів на даному диску. Зверніть увагу на швидкість пошуку файлів і
швидкість роботи вашої програми.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*