Dit is 'm dan, de NLDFileSearch unit.
Hoewel de functionaliteit wel handig is, is de implementatie waarschijnlijk één van de mooiste staaltjes van "moeilijk doen als het ook makkelijk kan", maar daarom misschien juist wel leuk en leerzaam.
Het stelt misschien weinig voor bij alle grote open source projecten, maar toch wil ik dit stukje code delen om wat mensen tegemoet te komen. Met name de mensen die moeite hebben met het implementeren van FindFirst..FindNext constructies voor het zoeken naar files.
Ach, neem deze code "Ter Leringh Ende Vermaeckh"
In deze unit zitten twee (eigenlijk drie) procedures die een opgegeven pad afzoeken.
Code:
procedure NLDEnumFiles(Path: string; CallBack: TNLDFoundFileProc;
Options: TFSOptions); overload;
procedure NLDEnumFiles(Path: string; CallBack: TNLDFoundFileEvent;
Options: TFSOptions); overload;
procedure NLDGetFiles(Path: string; List: TStrings;
Options: TFSOptions);
De EnumFiles procedures geven elke gevonden file terug aan de ingestelde callback. Een callback procedure kan een gewone procedure of een method van een class zijn. De callback krijgt als parameters de filename en de atributen van de gevonden file.
De GetFiles functie zet alle gevonden files in de meegegeven TStrings.
- Path is het pad, eventueel met een mask waarnaar gezocht moet worden, bijvoorbeeld
'c:\mijn documenten\' voor het zoeken naar alle bestanden in deze map.
of
'c:\mijn documenten\*.doc' voor het zoeken naar alle documenten in deze map.
- Options is een set met zoekopties.
Enkele opties zijn:
~ soRecursive: Zoekt recursief
~ soNoDirs: Geeft alleen bestanden terug, geen mappen.
~ soDirsOnly: Geeft alleen mapnamen terug, geen bestanden
Deze optie wordt genegeerd als soNoDirs is gezet.
~ soExcludePath: Geeft de bestandsnaam terug zonder pad.
~ soRelativePaths: Geeft de bestandsnaam met het relatieve pad.
Deze optie wordt genegeerd als soExcludePaths is gezet.
Goed.. Twee simpele voorbeeldjes:
Op een form staat een listbox, genaamd Listbox1. In de show van het form zet ik de code:
NLDGetFiles('c:\', ListBox1.Items, [soNoDirs]);
In de listbox staan nu alle files in de root van C: opgesomd.
NLDGetFiles('d:\media\audio\*.mp3', ListBox1.Items, [soRecursive, soNoDirs]);
Zoekt alle mp3 bestanden in d:\media\audio
Een ander voorbeeld:
Op een form zet ik een listbox en een button. Een klik op de button start de zoekprocedure. Elke gevonden file wordt teruggeven aan de FoundFile procedure. Deze zet de gevonden files in de listbox en zet de namen van de gevonden mappen in het label, zodat je kunt zien hoe het zoeken vordert.
Code:
type
TForm1 = class(TForm)
Button1: TButton;
Listbox1: TListBox;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
procedure FileFound(const FileName: string; Attr: Integer;
var DoContinue: TFSContinue);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
NLDEnumFiles('d:\*.txt', FileFound, [soRecursive]);
end;
procedure TForm1.FileFound(const FileName: string; Attr: Integer;
var DoContinue: TFSContinue);
begin
if Attr and faDirectory <> 0then
begin
Label1.Caption := FileName;
Label1.Refresh;
Exit;
end;
Listbox1.Items.Add(FileName);
end;
Natuurlijk zijn er nog veel meer mogelijkheden. Niet alleen zijn er allerlei opties die bij het zoeken kunnen worden meegegeven, maar ook kun je gebruik maken van de TNLDCustomFileSearch class of één van de afgeleiden.
De unit is te vinden op ftp://ftp.nldelphi.com/public/OpenSo...NLDFileSearch/. De eerste en tot nu toe enige 'officiële' release is NLDFileSearch1.1.1.zip
Bookmarks