Delphi-Quellcode:
procedure GetFilesInDirectory(const Directory, Mask: String;
List: TStringDictionary; WithSubDirs, ClearList: Boolean);
procedure ScanDir(const Directory: String);
var
SR: TSearchRec;
begin
if FindFirst(Directory + Mask, faAnyFile - faDirectory, SR) = 0 then
try
repeat
//if not List.Contains(Directory + SR.Name) then
List.Add(Directory + SR.Name);
until FindNext(SR) <> 0;
finally
FindClose(SR);
end;
if WithSubDirs then begin
if FindFirst(Directory + '*.*', faAnyFile, SR) = 0 then try
repeat
if ((SR.attr and faDirectory) = faDirectory) and
(SR.Name <> '.') and (SR.Name <> '..') then
ScanDir(Directory + SR.Name + '\');
until FindNext(SR) <> 0;
finally
FindClose(SR);
end;
end;
end;
begin
if ClearList then
List.Clear;
if Directory = '' then Exit;
ScanDir(IncludeTrailingPathDelimiter(Directory));
end;
Das ganze könnte man dann noch so optimieren, das gleich mehere Masken übergeben werden könnte,
man nur noch eine Suchschleife in der Funktion hat und selber filtert.
Zusätzlich muß die Suchfunktion dann auch nur noch einmal aufgerufen werden.
[edit]
Prüfung auf doppelte Einträge wieder rausgemacht (auskommentiert), denn Doppeltes kann hier ja nicht vorkommen
[add]
http://www.delphipraxis.net/internal...034817#1034817
Delphi-Quellcode:
procedure GetFilesInDirectory(const Directory, Mask: String;
List: TStringDictionary; WithSubDirs, ClearList: Boolean);
procedure ScanDir(const Directory: String);
var
SR: TSearchRec;
begin
if FindFirst(Directory + '*.*', faAnyFile, SR) = 0 then try
repeat
if (SR.Name <> '.') and (SR.Name <> '..') then
if SR.attr and faDirectory <> 0 then
begin
if WithSubDirs then
ScanDir(Directory + SR.Name + '\')
end
else if MatchText(Mask, SR.Name, False) then
List.Add(Directory + SR.Name);
until FindNext(SR) <> 0;
finally
FindClose(SR);
end;
end;
begin
if ClearList then
List.Clear;
if Directory <> '' then
ScanDir(IncludeTrailingPathDelimiter(Directory));
end;
GetFilesInDirectory(direct, '*.jpg|*.png|*.pdf|*.bmp|*.gif*', Hashlist, True, True);