Il codice RTL dietro GetFiles
chiama Masks.MatchesMask
per verificare una corrispondenza con il modello di ricerca. Questa funzione supporta solo il mascheramento contro una singola maschera.
L'alternativa è utilizzare il sovraccarico GetFiles
che ammette uno TFilterPredicate
. Fornisci un predicato che verifica se un nome corrisponde o meno al tuo modello.
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;
notano che MatchesMask
crea e distrugge un mucchio allocato TMask
ogni volta che viene chiamato. Posso immaginarlo come un collo di bottiglia per le prestazioni durante una lunga ricerca. In tal caso, è possibile creare una serie di oggetti da MaskArray
. E usa quelli del predicato per testare. Non ho idea se questa sia una preoccupazione valida o meno, solo una cosa che mi è venuta in mente mentre stavo leggendo il codice.
fonte
2012-10-04 12:08:45
Bello. +1 Si interrompe quando vengono utilizzati i file con un punto e virgola nel nome, ma non è colpa di questa routine. Non ho mai capito perché non usassero qualcosa come una pipa per separare le maschere. –
Sì, ovviamente puoi scegliere il tuo carattere separato da uno dei caratteri di file illegali –
Grazie. Conosco i predicati. Volevo solo assicurarmi che non ci sia davvero alcuna funzione che supporta direttamente più tipi di file. – Ampere