2011-11-09 10 views
11

Estoy usando las llamadas a la API de Windows FindFirstFile y FindNextFile para buscar archivos que coincidan con una cadena de comodín determinada en un directorio. Por ejemplo, podría querer encontrar todos los archivos XML en un directorio, y entonces busco usando el patrón "* .xml".¿Existe una alternativa a la API FindFirstFile/FindNextFile de Windows que no busca nombres de archivos cortos?

Me encuentro con el problema de que si estoy buscando una extensión de 3 letras, y la extensión de un archivo comienza con esa extensión de 3 letras, mi búsqueda lo detectará, incluso si la extensión contiene más caracteres después de esos primeros 3. Por ejemplo, si mi archivo se llama somelongname.xmlaaaa, la búsqueda de "* .xml" lo detectará. El nombre corto de ese archivo es somelo ~ 1.xml, que coincide con la cadena de mi comodín.

Podría hacer mi propia coincidencia de comodines para evitar este problema, pero presumiblemente una API de Windows sería capaz de hacer esto de manera más eficiente que lo que podría, y mi código sería más simple. Por lo que puedo decir, no hay una manera de forzar estas funciones para ignorar los nombres cortos. ¿Hay alguna exposición API Windows con esta funcionalidad?

Respuesta

3

Desafortunadamente , la documentación que encontró JoeFish en su respuesta resulta ser un poco engañosa. La búsqueda aún encontrará archivos que coincidan con el nombre corto, incluso si pasa en FindExInfoBasic. Simplemente no incluirá el nombre corto del archivo en el miembro cAlternateFileName de la estructura WIN32_FIND_DATA.

Sin embargo, encontré que hay una función de Windows PathMatchSpec que hará la misma coincidencia de comodín con una cadena suministrada. Entonces, pude agregar un segundo paso a mi búsqueda que verifica que el nombre largo coincida con el patrón. Incluso está disponible en Windows XP.

11

Salida FindFirstFileEx - que tiene un parámetro fInfoLevelId que toma una enumeración FINDEX_INFO_LEVELS:

typedef enum _FINDEX_INFO_LEVELS { 
    FindExInfoStandard, 
    FindExInfoBasic, 
    FindExInfoMaxInfoLevel 
} FINDEX_INFO_LEVELS; 

FindExInfoBasic

La función FindFirstFileEx no consulta el nombre de archivo corto, lo que mejora la velocidad general enumeración. Los datos se devuelven en una estructura WIN32_FIND_DATA y el miembro cAlternateFileName siempre es una cadena NULL.

Sin embargo:

Windows Server 2008, Windows Vista, Windows Server 2003 y Windows XP: Este valor no se admite hasta que Windows Server 2008 R2 y Windows 7.

+0

Interesante. Necesito apoyar Windows XP, entonces probablemente no pueda confiar en esta funcionalidad. Desafortunadamente, el hecho de que esto se haya agregado a esta API en Windows 7 probablemente indica que no existe en ninguna otra API antes. –

+0

Parece que ese es el caso. Lamento haberte fallado :) Y gracias por la edición, @Rob – JoeFish

+0

Resulta que esta documentación es muy engañosa. La búsqueda aún encontrará archivos que coincidan con el nombre corto, incluso si pasa en FindExInfoBasic. Simplemente no incluirá el nombre corto del archivo en el miembro cAlternateFileName de la estructura WIN32_FIND_DATA. –

Cuestiones relacionadas