9

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

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

但是,我想传递多种文件类型。我从FilterComboBox.Mask. 所以,它是一个看起来像'*.txt;*.rtf;*.doc'.

我试图将该字符串直接传递给GetFiles它,但它不起作用。我是否必须解析它,将其分成几块并将每一块都喂给GetFiles?

4

1 回答 1

17

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我可以想象这是长时间搜索的性能瓶颈。在这种情况下,您可以TMaskMaskArray. 并使用谓词中的那些来测试。我不知道这是否是一个有效的问题,只是我在阅读代码时发生的事情。

于 2012-10-04T12:08:45.380 回答