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 usarGetFileInformationByHandle
; miradwVolumeSerialNumber
/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.