TDirectory.GetFiles
有一个名为SearchPattern
的参数。 Embarcadero的文档说
匹配文件名时使用的掩码(例如,“* .exe”匹配所有可执行文件)。
但是,我想传递多种文件类型。我从FilterComboBox.Mask
获得了这些类型。所以,它是一个看起来像'*.txt;*.rtf;*.doc'
的字符串。
我试图将该字符串直接传递给GetFiles
,但它不起作用。我是否必须解析它,将其分解成碎片并将每个单独的部分提供给GetFiles
?
答案 0 :(得分:12)
GetFiles
后面的RTL代码调用Masks.MatchesMask
来测试您的搜索模式是否匹配。此功能仅支持对单个掩码进行屏蔽。
另一种方法是使用允许GetFiles
的{{1}}重载。您提供了一个谓词,用于测试名称是否与您的模式匹配。
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;
每次调用时都会创建并销毁分配了TMask
的堆。我可以想象,这是长时间搜索的性能瓶颈。在这种情况下,您可以从MatchesMask
创建一个TMask
个对象数组。并使用谓词中的那些进行测试。我不知道这是否是一个有效的关注,只是在我仔细阅读代码时发生的事情。