如何将多个文件扩展名传递给TDirectory.GetFiles?

时间:2012-10-04 11:57:26

标签: delphi delphi-xe

TDirectory.GetFiles有一个名为SearchPattern的参数。 Embarcadero的文档说

  

匹配文件名时使用的掩码(例如,“* .exe”匹配所有可执行文件)。

但是,我想传递多种文件类型。我从FilterComboBox.Mask获得了这些类型。所以,它是一个看起来像'*.txt;*.rtf;*.doc'的字符串。

我试图将该字符串直接传递给GetFiles,但它不起作用。我是否必须解析它,将其分解成碎片并将每个单独的部分提供给GetFiles

1 个答案:

答案 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个对象数组。并使用谓词中的那些进行测试。我不知道这是否是一个有效的关注,只是在我仔细阅读代码时发生的事情。