Пошук файлів на delphi, різні статті, статті, програмування - програмування c, delphi, c #

Як визначити чи підключено комп'ютер до інтернету

Пошук файлів на Delphi

Для пошуку файлів на диску в Delphi існує дві функції, перша з них - це FindFirst, нижче приведено її опис:

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

Path - шлях, по якому шукати файл, включаючи його ім'я та розширення (можливо використовувати символ *).

attr - атрибути файлу. Може приймати наступні значення:

faReadOnly $ 00000001 Тільки читання
faHidden $ 00000002 Прихований
faSysFile $ 00000004 Системний
faVolumeID $ 00000008 Метка диска
faDirectory $ 00000010 Директорія
faArchive $ 00000020 Звичайний
faAnyFile $ 0000003F Будь-який файл

F- змінна типу TsearchRec, в неї Delphi запихає все характеристики знайденого файлу. Опис типу TsearchRec (пропоную тільки для того, щоб було простіше освоїтися, сам тип вже описаний в SysUtils).

type
TSearchRec = record
Time: Integer; // час створення
Size: Integer; // розмір файлу в байтах
Attr: Integer; // Атрибути
Name: TFileName; //ім'я файлу
ExcludeAttr: Integer;
FindHandle: THandle; // Хандлі на файл
FindData: TWin32FindData; // доп. інформація про фото
end;


Тепер наведу простий приклад використання цієї функції. Поставте на форму одну кнопку TButton, а обробник події OnClick у неї повинен мати приблизно такий вигляд:

procedure TForm1.Button1Click (Sender: TObject);
var sr: TSearchRec;
begin
findFirst ( '*. exe', faAnyFile, sr);
edit1.Text: = sr.Name;
end;

Щоб шукати наступний такий же файл, треба написати FindNext (Sr); Якщо файл знайдений, то процедури FindFirst і FindNext повертають 0 (зеро).

Ну а тепер власне про те, як можна застосувати ці функції на практиці, тобто знову приклад. Щоб розібратися з використанням цих функцій спробуємо написати програму, яка видавала список всіх програм з розширенням * .exe у вказаній директорії, а потім при натисканні на кнопку включалася б обрана програма. На прикладі я покажу, як знайти всі .exe файли в директорії Windows, а потім поясню як можна модифікувати програму!

Отже, ставимо на форму компонент TListBox в нього ми будемо виводити список знайдених файлів. Обробник події OnClick для нашої першої кнопки замінюємо на такий:

procedure TForm1.Button1Click (Sender: TObject);
var sr: TSearchRec;
Result: word;
begin
ChDir ( 'C: \ windows'); // міняємо папку на C: \ Windows
Result: = FindFirst ( '* .exe', faAnyFile, sr);
ListBox1.Clear;
While result = 0 do
Begin
Result: = FindNext (sr);
ListBox1.Items.add (sr.name);
End;
end;

Як бачите ми просто організували циклічний прохід по директорії C: \ Windows, який припиняється, як тільки функції повертатися не нуль! Функція ChDir була використана для зміни папки з поточної на папку C: \ windows \

Але наведений вище спосіб знаходить файли лише в тому каталозі, який заданий змінної Path: String. Мені здається, цього недостатньо для вирішення більшої частини пошукових проблем, тому варто написати алгоритм пошуку файлів в кожної знайденої директорії.

У мене розширена процедура пошуку виглядає ось так:

procedure ffind (cat: string); // каталог, звідки почати пошук
var sea: TSearchRec;
res: integer; // результат пошуку (0 чи ні)
begin
res: = FindFirst (cat + '*. *', faAnyFile, sea); // шукаємо перший файл
res: = findNext (sea); // шукаємо наступний файл
While res = 0 do
begin
if (Sea.Attr = faDirectory) and ((Sea.Name = '.') or (Sea.Name = '..')) then // щоб не було файлів. і ..
begin
Res: = FindNext (sea);
Continue; // продовжуємо цикл
end;

if (Sea.Attr = faDirectory) then // якщо знайшли директорію, то шукаємо файли в ній
begin
Ffind (cat + Sea.Name + '\'); // рекурсивно викликаємо нашу процедуру
Res: = FindNext (Sea); // шукаємо слід. файл
Continue; // продовжуємо цикл
end;
form1.ListBox1.Items.Add (Sea.Name); // додаємо в Listbox: Tlistbox ім'я файлу
Res: = FindNext (Sea); // шукаємо слід. файл
end;
FindClose (Sea); // звільняємо пересеніем пошуку
end;

Тут була використана процедура FindClose (var sea: TsearchRec); вона необхідна для звільнення пошукової змінної. У наступних прикладах її я використовувати не буду, але Ви майте її на увазі.

Можливо, цей алгоритм не найшвидший і зручний, але він працює.
Для того, щоб ваше додаток не виглядало підвішеному, можна додати Application.ProcessMessages в початок нашої процедури.

Тепер поставте на форму ще кнопку для того, щоб по її натисканні запускати обрану в ListBox'e програму. Обробник події Onclick для нашої другої кнопки у мене вийшов таким:

procedure TForm1.Button2Click (Sender: TObject);
begin
WinExec (pchar (listbox1.Items [listbox1.itemindex]), sw_show);
end;

Оскільки файли знаходяться в директорії Windows, то при виклику методу WinExec шлях до файлів можна не вказувати, а якщо ви використовуєте будь-яку іншу директорію, то виклик методу WinExec повинен бути приблизно таким:

WinExec (pchar ( 'C: \ Шлях до вашої папки \' + listbox1.Items [listbox1.itemindex]), sw_show);

Ну якщо ви хочете шукати файли в зазначеному користувачем каталозі можна використовувати компонент DirectoryListBox, який дає доступ до каталогів на вашому комп'ютері і дозволяє змінювати поточний каталог подвійним натисканням миші. Дізнатися обраний каталог можна так:

Тому в обробнику першої кнопки потрібно прибрати виклик функції ChDir. А в обробнику другої кнопки вставити наведену вище конструкцію.

Таким чином приведу повний код програми, з якою вийшло у мене з використанням компонента DirectoryListBox

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, FileCtrl;

type
TForm1 = class (TForm)
Edit1: TEdit;
Button1: TButton;
ListBox1: TListBox;
Button2: TButton;
DirectoryListBox1: TDirectoryListBox;
procedure Button1Click (Sender: TObject);
procedure Button2Click (Sender: TObject);
private

public

end;

var
Form1: TForm1;

procedure TForm1.Button1Click (Sender: TObject);
var sr: TSearchRec;
Result: word;
begin
Result: = FindFirst ( '* .exe', faAnyFile, sr);
ListBox1.Clear;
While result = 0 do
Begin
Result: = FindNext (sr);
ListBox1.Items.add (sr.name);
End;
end;

procedure TForm1.Button2Click (Sender: TObject);
begin
WinExec (pchar (DirectoryListBox1.Directory + '\' + listbox1.Items [listbox1.itemindex]), sw_show);
end;

Ну ось і все :)) Сподіваюся, що допоміг Вам своїми міркуваннями і прикладами!

Схожі статті