最简单的方法是使用ExtractFileExt
当前文件名并检查它是否与您想要的扩展名匹配。
这是您例程的完全重写版本,FileSearch
它完全符合您的要求(无论如何,根据您的问题):
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;
虽然另一个建议使用多个扩展作为掩码的答案*.cbr;*.cbz
应该(无论如何原则上)有效,但我通过痛苦的经验注意到,Delphi 中的FindFirst
andFindNext
方法往往不接受掩码中的多个扩展!
我提供的代码应该可以很好地满足您的需求,尽情享受吧!
更新:允许在运行时动态地在掩码中使用多个扩展(如 OP 对此答案的第一条评论所示)。
我们要做的是String
从您的TEdit
控制中获取一个(这String
是一个或多个文件扩展名,正如您所期望的那样),将其“分解”String
成一个Array
,并将每个文件与Array
.
听起来比它更复杂:
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;
此代码将填充FMask
每个单独的掩码扩展名,这些扩展名由;
诸如.CBR;.CBZ
.
请注意,此方法不接受通配符或任何其他正则表达式魔法,但您可以根据需要对其进行修改!
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;
我们现在需要一个函数来确定指定文件是否与任何定义的扩展匹配:
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;
现在这是修改后的FileSearch
程序:
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;
最后,这是您启动搜索的方式:
procedure TFAutoSearch.btnSearchClick(Sender: TObject);
begin
ExplodeMask(edMask.Text);
FileSearch(edPath.Text);
end;
WhereedMask
在您的问题中定义为Edit2
并且edPath
在您的问题中定义为Edit1
。请记住,此方法不支持使用通配符或其他特殊字符,因此edMask.Text
应该类似于.CBR;.CBZ
如果您使用 Delphi 的 Regex 库,您可以轻松地修改此方法以支持您可以想象的所有表达式案例!