9

TDirectory.GetFilesと呼ばれるパラメータがありますSearchPattern。Embarcaderoのドキュメントには

ファイル名を照合するときに使用されるマスク(たとえば、「*。exe」はすべての実行可能ファイルを照合します)。

ただし、複数のファイルタイプを渡したい。これらのタイプはから取得しますFilterComboBox.Mask。つまり、のような文字列です'*.txt;*.rtf;*.doc'

その文字列を直接に渡そうとしましたがGetFiles、機能しません。それを解析し、細かく分割して、個々のピースをすべてにフィードする必要がありGetFilesますか?

4

1 に答える 1

17

検索パターンとの一致をテストするためのGetFiles呼び出しの背後にあるRTLコード。Masks.MatchesMaskこの関数は、単一のマスクに対するマスキングのみをサポートします。

GetFiles別の方法は、を許可する過負荷を使用すること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。そして、述語でそれらを使用してテストします。これが有効な懸念事項であるかどうかはわかりません。コードを熟読しているときに発生した問題です。

于 2012-10-04T12:08:45.380 に答える