Функція FindFirst., Робота з файлами і директоріями, Delphi, статті

Синтаксис:

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>

*

*