Пятница, 20.06.2025
Королевство Delphi
Главное меню
Статьи
Наш опрос
Нужен форум на сайте?
Всего ответов: 91
Статистика
Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
Главная » Статьи » Разные » Примеры Delphi

Поиск файлов на винчестере

Хотя я и не очень хороший "Делфер", но я очень люблю программировать в Delphi, делать маленькие полезные программки для себя и своего компьютера. Недавно я узнал как производить поиск файлов на компьютере, причем поиск файлов производится не в отдельном каталоге, а на всем винчестере и в процессе поиска возможно следить за поиском. Процедуре поиска я нашел очень широкое применение, например, у меня на компьютере имеется папка с исходниками по Delphi и в этой папки очень много лишних файлов, которые занимают место на винчестере и при помощи процедуры поиска я удаляю ненужные файлы (*.cfg; *.~dfm; *.~pas и др.).

Начнем с описания процедуры FindResursive( Const path: String; Const mask: String) где переменная Path - каталог в котором будет производится поиск ('c:\'), а Mask - название файла или его часть ('*.exe' или '*.*' или 'project.dpr'). 

В самой процедуре будем использовать только одну (не считая вложенные функции)переменную, которая будет носить полное название  найденного файла. А найденные файлы будем записывать в ListBox. Данную процедуру будем вызывать при нажатии кнопки. Процедура FindRecursive выглядит следующим образом: 

Procedure FindRecursive( Const path: String; Const mask: String);
 Var
 fullpath: String;
 Function Recurse( Var path: String; Const mask: String ): Boolean;
 Var
 SRec: TSearchRec;
 retval: Integer;
 oldlen: Integer;
 Begin
 Recurse := True;
 oldlen := Length( path );
 retval := FindFirst( path+mask, faAnyFile, SRec );
 While retval = 0 Do Begin
 If (SRec.Attr and (faDirectory or faVolumeID)) = 0 Then
 form1.ListBox1.items.Add(path+srec.name);
 retval := FindNext( SRec );
 End;
 FindClose( SRec );
 If not Result Then Exit;
 retval := FindFirst( path+'*.*', faDirectory, SRec );
 While retval = 0 Do Begin
 If (SRec.Attr and faDirectory) <> 0 Then
 If (SRec.Name <> '.') and (SRec.Name <> '..') Then Begin
 path := path + SRec.Name + '\';
 If not Recurse( path, mask ) Then Begin
 Result := False;
 Break;
 End;
 Delete( path, oldlen+1, 255 );
 End;
 retval := FindNext( SRec );
 End;
 FindClose( SRec );
 End; { Recurse }
 Begin
 If path = '' Then
 GetDir(0, fullpath)
 Else
 fullpath := path;
 If fullpath[Length(fullpath)] <> '\' Then
 fullpath := fullpath + '\';
 If mask = '' Then
 Recurse( fullpath, '*.*' )
 Else
 Recurse( fullpath, mask );
 End;

В целом же программа выглядит так:

unit Unit1;

interface

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

type
 TForm1 = class(TForm)
 ListBox1: TListBox;
 Button1: TButton;
 procedure Button1Click(Sender: TObject);
 private
 { Private declarations }
 public
 { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}
Procedure FindRecursive( Const path: String; Const mask: String);
 Var
 fullpath: String;
 Function Recurse( Var path: String; Const mask: String ): Boolean;
 Var
 SRec: TSearchRec;
 retval: Integer;
 oldlen: Integer;
 Begin
 Recurse := True;
 oldlen := Length( path );
 retval := FindFirst( path+mask, faAnyFile, SRec );
 While retval = 0 Do Begin
 If (SRec.Attr and (faDirectory or faVolumeID)) = 0 Then
 form1.ListBox1.items.Add(path+srec.name); {добавление}
 {очередного найденного файла в ListBox}
 {-------------------------------------}
 {здесь можно производить слежением за выполнение процедуры}
 {например, поставить ProgressBar}
 retval := FindNext( SRec );
 End;
 FindClose( SRec );
 If not Result Then Exit;
 retval := FindFirst( path+'*.*', faDirectory, SRec );
 While retval = 0 Do Begin
 If (SRec.Attr and faDirectory) <> 0 Then
 If (SRec.Name <> '.') and (SRec.Name <> '..') Then Begin
 path := path + SRec.Name + '\';
 If not Recurse( path, mask ) Then Begin
 Result := False;
 Break;
 End;
 Delete( path, oldlen+1, 255 );
 End;
 retval := FindNext( SRec );
 End;
 FindClose( SRec );
 End; { Recurse }
 Begin
 If path = '' Then
 GetDir(0, fullpath)
 Else
 fullpath := path;
 If fullpath[Length(fullpath)] <> '\' Then
 fullpath := fullpath + '\';
 If mask = '' Then
 Recurse( fullpath, '*.*' )
 Else
 Recurse( fullpath, mask );
 End;


procedure TForm1.Button1Click(Sender: TObject);
begin
FindRecursive('d:\','*.*'); {вместо 'd:\' можно написать лубой каталог}
end;

Автор: Михаил Христосенко

Получить ссылку на материал

Категория: Примеры Delphi | Добавил: Барон (20.12.2011)
Просмотров: 804 | Теги: Файл, поиск | Рейтинг: 0.0/0
[ Пожертвования для сайта ] [ Пожаловаться на материал ]

Если вам помог материал сайта кликните по оплаченной рекламе размещенной в центре

Поиск
Категории раздела
Delphi.NET [3]
Kylix Delphi for Linux [9]
Советы Дельферу [6]
Хитрости в Delphi [2]
Обзор Delphi [45]
Инсталлятор [11]
Пользовательский интерфейс [18]
Примеры Delphi [93]
Функции и процедуры [15]
Разные [31]
Королевство Delphi © 2010-2025
Яндекс цитирования