2012-10-04 8 views
6

TDirectory.GetFiles ha un parametro chiamato SearchPattern. la documentazione di Embarcadero diceCome passare più estensioni di file a TDirectory.GetFiles?

La maschera usata quando corrispondenti nomi dei file (ad esempio, "* .exe" corrisponde a tutti i file eseguibili).

Tuttavia, voglio passare più tipi di file. Ottengo quei tipi da un FilterComboBox.Mask. Quindi, è una stringa che assomiglia a '*.txt;*.rtf;*.doc'.

Ho provato a passare quella stringa direttamente a GetFiles e non funziona. Devo analizzarlo, spezzarlo e dare da mangiare ogni singolo pezzo a GetFiles?

risposta

11

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.

+0

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. –

+0

Sì, ovviamente puoi scegliere il tuo carattere separato da uno dei caratteri di file illegali –

+0

Grazie. Conosco i predicati. Volevo solo assicurarmi che non ci sia davvero alcuna funzione che supporta direttamente più tipi di file. – Ampere

Problemi correlati