検索パターンとの一致をテストするための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
。そして、述語でそれらを使用してテストします。これが有効な懸念事項であるかどうかはわかりません。コードを熟読しているときに発生した問題です。