TDirectory.GetFiles有一个名为的参数SearchPattern.Embarcadero的文档说
匹配文件名时使用的掩码(例如,"*.exe"匹配所有可执行文件).
但是,我想传递多种文件类型.我从那里得到那些类型FilterComboBox.Mask.所以,它是一个看起来像的字符串'*.txt;*.rtf;*.doc'.
我试图直接传递该字符串GetFiles,但它不起作用.我是否需要解析它,将其分解成碎片并将每个单独的部分送入GetFiles?
Dav*_*nan 15
后面的RTL代码GetFiles调用Masks.MatchesMask测试匹配您的搜索模式.此功能仅支持对单个掩码进行屏蔽.
另一种方法是使用GetFiles承认a 的重载TFilterPredicate.您提供了一个谓词,用于测试名称是否与您的模式匹配.
uses
StrUtils, Types, Masks, IOUtils;
function MyGetFiles(const Path, Masks: string): TStringDynArray;
var
MaskArray: TStringDynArray;
Predicate: TDirectory.TFilterPredicate;
begin
MaskArray := SplitString(Masks, ';');
Predicate :=
function(const Path: string; const SearchRec: TSearchRec): Boolean
var
Mask: string;
begin
for Mask in MaskArray do
if MatchesMask(SearchRec.Name, Mask) then
exit(True);
exit(False);
end;
Result := TDirectory.GetFiles(Path, Predicate);
end;
Run Code Online (Sandbox Code Playgroud)
请注意,每次调用时都会MatchesMask创建和销毁分配的堆TMask.我可以想象,这是长时间搜索的性能瓶颈.在这种情况下,您可以从中创建一个TMask对象数组MaskArray.并使用谓词中的那些进行测试.我不知道这是否是一个有效的关注,只是在我仔细阅读代码时发生的事情.