2012-10-04 28 views
6

TDirectory.GetFiles tiene un parámetro llamado SearchPattern. La documentación de Embarcadero diceCómo pasar múltiples extensiones de archivo a TDirectory.GetFiles?

La máscara utilizada al hacer coincidir los nombres de los archivos (por ejemplo, "* .exe" coincide con todos los archivos ejecutables).

Sin embargo, quiero pasar varios tipos de archivos. Obtengo esos tipos de FilterComboBox.Mask. Entonces, es una cadena que se ve como '*.txt;*.rtf;*.doc'.

He intentado pasar esa cadena directamente al GetFiles y no funciona. ¿Debo analizarlo, romperlo en pedazos y alimentar cada pieza individual al GetFiles?

Respuesta

11

El código RTL detrás de GetFiles llama al Masks.MatchesMask para comprobar que coincida con su patrón de búsqueda. Esta función solo admite el enmascaramiento contra una sola máscara.

La alternativa es usar la sobrecarga GetFiles que admite TFilterPredicate. Proporciona un predicado que evalúa si un nombre coincide con su patrón o no.

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; 

tenga en cuenta que MatchesMask crea y destruye un montón asignado TMask cada vez que se llama. Puedo imaginarme que es un cuello de botella de rendimiento en una larga búsqueda. En ese caso, puede crear una matriz de objetos TMask desde MaskArray. Y usa aquellos en el predicado para probar. No tengo idea de si esto es una preocupación válida o no, simplemente algo que se me ocurrió mientras examinaba el código.

+0

Nice one. +1 Se rompe cuando se usan archivos con un punto y coma en el nombre, pero eso no es culpa de esta rutina. Nunca entendí por qué no usaban algo así como una tubería para separar las máscaras. –

+0

Sí, obviamente, puede elegir su char de sep de uno de los caracteres del nombre de archivo ilegal –

+0

Gracias. Sé acerca de los predicados. Solo quería asegurarme de que no hay ninguna función que soporte directamente múltiples tipos de archivos. – Ampere

Cuestiones relacionadas