Lazarus free pascal - Dosya içeriğinde arama
Windows'un Dosya Gezgininde, bir dizinde bulunan dosyalar için içerik araması yapılabiliyor. Fakat text tabanlı dosyalardan sadece .txt uzantılı dosyalara bakabiliyor. Bana lazım olan, .pas uzantılı Pascal kaynak kodlarına bakamıyor.
Programlamada yeni olanlar için (benim gibi), örneğin bir komutun kullanımını görmek amacıyla örnek dosyalara bakmak çok faydalı oluyor. Bu yazıda, bu amaca yönelik basit bir program geliştirdim. Program da denemez belki programcık desek daha doğru olur. Lazarus ile bu tip projeler oluşturmak gerçekten çok kolaymış. Adamlar bu iş için gerekli kütüphaneleri önceden oluşturdukları için program, karmaşık bir hal almadan tamamlandı.. Lazarus forumunda biraz araştırma yapmak yeterli oldu.
FileUtil kütüphanesi içinde yer alan FindAllFiles fonksiyonu işimi gayet güzel gördü.. FileUtil'i ayrıca kurmanıza gerek yok, Lazarus ile birlikte geliyor. Uses satırına yazmanız yeterli oluyor. (Wiki sayfasında Project Inspector ile FileUtil'i projeye dahil edin demiş ama dediğim gibi buna gerek kalmadı. Wiki güncellenmemiş heralde)
FindAllFiles'ın yaptığı güzel bir iş, çünkü alt klasörlere veya dizinlere de bakabiliyor. Bu amaçla, aşağıda programda göreceksiniz 3. parametreyi True yapmak yeterli oluyor. Bunun için kendi kendini çağırması gerekiyor. Kendi kendini çağıran fonksiyona, "recursive" fonksiyon deniyor. Türkçeye çevirenler "öz yinelemeli" fonksiyon diye çevirmiş. Örneğin faktoriyel hesabı da bu şekilde yapılıyor.
Bu projenin bir diğer kahramanıda TStringList sınıfıdır. String'lerden oluşan bir listeyi tutar. Örneğin "Ali topu at" bir string olmaktadır. Birçok marifetinin yanısıra diskte bulunan bir text dosyasını, direk kendi içinde bulunan LoadFromFile prosedürü ile kendine yükleyebiliyor.. Listenin her satırına teker teker ulaşabiliyor olmamızın dışında tüm listeyi tek bir string'e de aktarabiliyoruz. Bunun için listenin Text özelliğini kullanmak yeterli oluyor. Bir başka özelliği ise örneğin noktalı virgülle ayrılmış bilgiler içeren bir csv dosyasını, virgüllerden arınmış şekilde içine alabiliyor. Özetle burada sayamadığım birçok şirinlikleri var anlayacağınız.
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls,
FileUtil;
type
{ TForm1 }
TForm1 = class(TForm)
ButtonSearch: TButton;
EditSearch: TEdit;
EditMask: TEdit;
EditFolder: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
ListBox: TListBox;
procedure ButtonSearchClick(Sender: TObject);
procedure ListBoxClick(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.ButtonSearchClick(Sender: TObject);
var
sl, fileContent: TStringList;
str: String;
i, counter: Integer;
begin
counter:= 0;
ListBox.Clear;
fileContent := TStringList.Create;
sl := TStringList.Create;
sl := FindAllFiles(EditFolder.Text, EditMask.Text, True);
Label2.Caption:= '';
try
for i:=0 to sl.Count-1 do begin
fileContent.LoadFromFile(sl.Strings[i]);
str:= AnsiLowerCase(fileContent.Text);
if str.IndexOf(AnsiLowerCase(EditSearch.Text)) <> -1 then
begin
ListBox.Items.Add(sl.Strings[i]);
Inc(counter);
end;
fileContent.Clear;
end;
if counter = 0 then
ShowMessage('No files found !')
else
Label2.Caption:= 'Found this word in ' + counter.ToString
+ ' files out of ' + sl.Count.ToString;
finally
//ShowMessage(AnsiLowerCase(sl.Text));
sl.Free;
fileContent.Free;
end;
end;
procedure TForm1.ListBoxClick(Sender: TObject);
var
sl: TStringList;
begin
sl := TStringList.Create;
try
sl.LoadFromFile(ListBox.Items.Strings[ListBox.ItemIndex]);
ShowMessage(sl.Text);
finally
sl.Free;
end;
end;
end.
Yorumlar
Yorum Gönder