TDirectory.GetFiles
有一个名为 的参数SearchPattern
。Embarcadero 的文件说
匹配文件名时使用的掩码(例如,“*.exe”匹配所有可执行文件)。
但是,我想传递多种文件类型。我从FilterComboBox.Mask
. 所以,它是一个看起来像'*.txt;*.rtf;*.doc'
.
我试图将该字符串直接传递给GetFiles
它,但它不起作用。我是否必须解析它,将其分成几块并将每一块都喂给GetFiles
?
TDirectory.GetFiles
有一个名为 的参数SearchPattern
。Embarcadero 的文件说
匹配文件名时使用的掩码(例如,“*.exe”匹配所有可执行文件)。
但是,我想传递多种文件类型。我从FilterComboBox.Mask
. 所以,它是一个看起来像'*.txt;*.rtf;*.doc'
.
我试图将该字符串直接传递给GetFiles
它,但它不起作用。我是否必须解析它,将其分成几块并将每一块都喂给GetFiles
?
GetFiles
调用背后的 RTL 代码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;
请注意,每次调用时都会MatchesMask
创建和销毁分配的堆。TMask
我可以想象这是长时间搜索的性能瓶颈。在这种情况下,您可以TMask
从MaskArray
. 并使用谓词中的那些来测试。我不知道这是否是一个有效的问题,只是我在阅读代码时发生的事情。