winapi case-insensitive

winapi - Comparación de nombre de archivo Win32



case-insensitive (3)

Si está utilizando .NET , la recomendación oficial de Microsoft es utilizar StringComparison.OrdinalIgnoreCase para la comparación y ToUpperInvariant para la normalización (que luego se comparará mediante la comparación Ordinal ). Esto también se aplica a las claves y valores de registro, variables de entorno, etc.

Consulte Nuevas recomendaciones para usar cadenas en Microsoft .NET 2.0 para obtener más detalles.

Tenga en cuenta que si bien es confiable en NTFS, puede fallar con recursos compartidos de red, por ejemplo. Consulte la respuesta de @ SteveSteiner y enlaces en su publicación para encontrar soluciones.

¿Alguien sabe qué configuración de cultura usa Win32 cuando trata con nombres de archivos insensibles a mayúsculas y minúsculas?

¿Es esto algo que varía en función de la cultura del usuario, o son las reglas de la carcasa que Win32 utiliza la cultura invariante?


La comparación de nombres de archivos en código nativo y No comparar nombres de archivos son algunas buenas publicaciones de blog sobre este tema. El primero tiene el código C / C ++ para OrdinalIgnoreCaseCompareStrings, y el segundo le dice cómo eso no siempre funciona para los nombres de archivo y qué hacer para mitigar eso.

Luego están los problemas Unicode. Si bien estos nuevos algoritmos de comparación de cadenas OrdinalIgnoreCase son excelentes para su unidad local NTFS, es posible que no proporcionen la respuesta correcta en su unidad FAT o en un recurso compartido de red.

Entonces, ¿cuál es la respuesta? Cuando sea posible, deja que el sistema de archivos te lo diga. CreateFile puede decirle si existe un nombre de archivo dado. Solo elija la disposición de creación correcta. Si necesita comparar con identificadores, a menudo puede usar GetFileInformationByHandle ; mira dwVolumeSerialNumber / nFileIndexHigh / nFileIndexLow .


Una respuesta aproximada es Comparando los nombres de archivo Unicode de la manera correcta .

Básicamente, la recomendación es CharUpper ambas cadenas (utilizando CharUpper , CharUpperBuff o LCMapString ), luego comparar utilizando una comparación binaria (es decir, memcmp o wmemcmp, no CompareString con una configuración regional invariable). El sistema de archivos no realiza la normalización Unicode, y las reglas de casos no dependen de la configuración regional.

Hay casos desafortunados ambiguos cuando se trata de personajes cuyas reglas de casing han cambiado en diferentes versiones de Unicode, pero es lo mejor que se puede hacer.