Der einfachste Weg ist die Verwendung von ExtractFileExt
mit dem aktuellen Dateinamen vergleichen und prüfen, ob er mit einer der gewünschten Erweiterungen übereinstimmt.
Hier ist eine vollständig umgeschriebene Version Ihrer FileSearch
Routine, die genau das tut, was Sie zu tun versuchen (laut Ihrer Frage jedenfalls):
procedure TFAutoSearch.FileSearch(const ARoot: String);
var
LExt, LRoot: String;
LRec: TSearchRec;
begin
LRoot := IncludeTrailingPathDelimiter(ARoot);
if FindFirst(LRoot + '*.*', faAnyFile, LRec) = 0 then
begin
try
repeat
if (LRec.Attr and faDirectory <> 0) and (LRec.Name <> '.') and (LRec.Name <> '..') then
FileSearch(LRoot + LRec.Name)
else
begin
LExt := UpperCase(ExtractFileExt(LRoot + LRec.Name));
if (LExt = '.CBR') or (LExt = '.CBZ') then
ListBox1.Items.Add(LRoot + LRec.Name);
end;
until (FindNext(LRec) <> 0);
finally
FindClose(LRec);
end;
end;
end;
Während die andere Antwort die Verwendung mehrerer Durchwahlen als Maske vorschlägt *.cbr;*.cbz
(prinzipiell) funktionieren sollte, habe ich aus bitterer Erfahrung festgestellt, dass die FindFirst
y FindNext
Methoden in Delphi neigen dazu, mehrere Erweiterungen in einer Maske nicht zu akzeptieren!
Der Code, den ich zur Verfügung gestellt habe, sollte für Ihre Bedürfnisse gut funktionieren, also viel Spaß!
AKTUALISIERT : Um die Verwendung von mehreren Erweiterungen in einer Maske dynamisch zur Laufzeit zu ermöglichen (wie im ersten Kommentar des Auftraggebers zu dieser Antwort angedeutet).
Was wir tun werden, ist eine String
von Ihrem TEdit
Kontrolle (diese String
ist eine oder mehrere Dateierweiterungen, wie Sie es erwarten würden), "Explode" die String
in eine Array
und gleichen jede Datei mit jeder Erweiterung in der Array
.
Das klingt komplizierter als es ist:
type
TStringArray = Array of String; // String Dynamic Array type...
// Now let's provide a "Mask Container" inside the containing class...
TFAutoSearch = class(TForm)
// Normal stuff in here
private
FMask: TStringArray; // Our "Mask Container"
end;
Dieser Code füllt FMask
mit jeder einzelnen Maskenerweiterung getrennt durch ein ;
wie zum Beispiel .CBR;.CBZ
.
Beachten Sie, dass diese Methode keine Wildcard-Zeichen oder andere Regex-Magie akzeptiert, aber Sie können sie nach Bedarf ändern!
procedure TFAutoSearch.ExplodeMask(const AValue: String);
var
LTempVal: String;
I, LPos: Integer;
begin
LTempVal := AValue;
I := 0;
while Length(LTempVal) > 0 do
begin
Inc(I);
SetLength(FMask, I);
LPos := Pos(';', LTempVal);
if (LPos > 0) then
begin
FMask[I - 1] := UpperCase(Copy(LTempVal, 0, LPos - 1));
LTempVal := Copy(LTempVal, LPos + 1, Length(LTempVal));
end
else
begin
FMask[I - 1] := UpperCase(LTempVal);
LTempVal := EmptyStr;
end;
end;
end;
Wir brauchen nun eine Funktion, die feststellt, ob die angegebene Datei einer der definierten Erweiterungen entspricht:
function TFAutoSearch.MatchMask(const AFileName: String): Boolean;
var
I: Integer;
LExt: String;
begin
Result := False;
LExt := UpperCase(ExtractFileExt(LExt));
for I := Low(FMask) to High(FMask) do
if (LExt = FMask[I]) then
begin
Result := True;
Break;
end;
end;
Hier ist die geänderte Version FileSearch
Verfahren:
procedure TFAutoSearch.FileSearch(const ARoot: String);
var
LRoot: String;
LRec: TSearchRec;
begin
LRoot := IncludeTrailingPathDelimiter(ARoot);
if FindFirst(LRoot + '*.*', faAnyFile, LRec) = 0 then
begin
try
repeat
if (LRec.Attr and faDirectory <> 0) and (LRec.Name <> '.') and (LRec.Name <> '..') then
FileSearch(LRoot + LRec.Name)
else
begin
if (MatchMask(LRoot + LRec.Name)) then
ListBox1.Items.Add(LRoot + LRec.Name);
end;
until (FindNext(LRec) <> 0);
finally
FindClose(LRec);
end;
end;
end;
Und schließlich: So leiten Sie Ihre Suche ein:
procedure TFAutoSearch.btnSearchClick(Sender: TObject);
begin
ExplodeMask(edMask.Text);
FileSearch(edPath.Text);
end;
Wo edMask
ist in Ihrer Frage definiert als Edit2
y edPath
ist in Ihrer Frage definiert als Edit1
. Denken Sie daran, dass diese Methode die Verwendung von Platzhaltern oder anderen Sonderzeichen nicht unterstützt, also edMask.Text
sollte etwa so lauten .CBR;.CBZ
Wenn Sie die Regex-Bibliothek für Delphi verwenden, können Sie diese Methode leicht modifizieren, um alle denkbaren Expression Cases zu unterstützen!