Lazarus free pascal - Dosya içeriğinde arama

 


Youtube'da izle..

Github'dan indir..

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.

İçinde, aranan kelimenin bulunduğu dosyalar listbox'da listelenecektir. Listede, bir dosyaya tıklayınca dosya içeriği mesaj penceresinde belirecektir.

Yorumlar

Bu blogdaki popüler yayınlar

VBA - Mscomm (seri port) ile veri loglama

RJ45 2 - Novexx barkod yazıcıya, S7-1200 plc ile etiket yazdırma

Lazarus free pascal - Tanıtım