PDA

Просмотр полной версии : [Программа] Пишем программу для поиска файлов.


.Master.
11.03.2014, 20:57
Ну что же, давайте попробуем написать программу, которая бы выдавала список всех программ с расширением *.exe в указанной директории, а затем при нажатии на кнопку включалась бы выбранная программа.

Кидаем на форму "TListBox" - в него мы будем выводить список найденных файлов. Обработчик событий для нашей первой кнопки изменим на такой:

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, который дает доступ к каталогам на вашем компьютере и позволяет менять текущий каталог двойным нажатием мыши. Узнаем выбранный каталог так:

DirectoryListBox1.Directory

Именно поэтому в обработчике первой кнопки, убираем вызов функции ChDir. А в обработчике второй кнопки вставить приведенную выше конструкцию.

Таким образом у нас с вами получается вот такой код:

unit Unit1;


interface


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

{ Private declarations }

public

{ Public declarations }

end;


var

Form1: TForm1;


implementation


{$R *.DFM}


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+'\'+list box1.Items[listbox1.itemindex]),sw_show);

end;


end.

Вот мы и реализовали нашу идею в жизнь. Спасибо за внимание.