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

WeG*_*ars 9 delphi delphi-xe

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