ejemplos datos comparar comparaciones como cadenas c# filesystems culture case-insensitive

datos - string.equals c#



.NET Cómo comparar dos cadenas que representan nombres de archivos que ignoran el caso correctamente (6)

Dado que (al menos en NTFS) el sistema de archivos en Windows no distingue entre mayúsculas y minúsculas, me gustaría comparar String fileA con String fileB como tal:

fileA.Equals(fileB, StringComparison.CurrentCultureIgnoreCase)

La pregunta entonces es qué cultura debo usar, ¿es suficiente la cultura actual por defecto (ui?)? Parece que no puedo encontrar ningún método BCL para este propósito.


Debe usar StringComparison.OrdinalIgnoreCase , como se detalla en Prácticas StringComparison.OrdinalIgnoreCase para el uso de cadenas en .NET Framework (busque "rutas de archivo" para encontrar la sección correspondiente).

Si utiliza una cultura para hacer coincidir las cadenas, puede obtener una ubicación donde, por ejemplo, los nombres "häl.gif" y "hal.gif" se consideren una coincidencia.


Esto no es posible hacerlo de forma fiable.

Sí, la conversión de casos para el sistema de archivos no distingue entre mayúsculas y minúsculas.

Pero la tabla de conversión de casos se almacena en el propio sistema de archivos (para NTFS), y cambia entre versiones (por ejemplo, la tabla de conversión de casos de Vista se llevó al nivel de Unicode 5, por lo que Vista NTFS y XP NTFS tienen diferentes reglas de conversión de casos) ).

Y lo que importa es el sistema operativo que formatea el sistema de archivos, no el sistema operativo actual.

Luego puede tener todo tipo de problemas con otros sistemas de archivos (Mac OS realiza algún tipo de normalización de Unicode (no la estándar)), Linux no hace nada, pero Samba (implementando el protocolo de intercambio de archivos de Windows) sí lo hace. Y tiene otras tablas además de Windows.

Entonces, ¿qué sucede si asigno una letra a un disco de red compartido por Linux o Mac OS?

En general, nunca debe intentar comparar nombres de archivos. Si quieres saber si está ahí, intenta acceder a él.


Intenté esto.

Path.GetFullPath(path1).Equals(Path.GetFullPath(path2))


Marcus

Es posible que desee ver la respuesta a otra pregunta de , que es muy similar: la comparación de nombres de archivos de Win32 , que a su vez menciona http://www.siao2.com/2005/10/17/481600.aspx .

Siguiendo un enlace en otra respuesta a la misma pregunta y buscando más, encontré el siguiente artículo de MSDN http://msdn.microsoft.com/en-us/library/ms973919.aspx . Vale la pena una lectura en general, pero cuando se trata de la comparación de nombres de archivos, se recomienda utilizar StringComparison.OrdinalIgnoreCase. Consulte la Tabla 1 en el artículo, que contiene las rutas de los archivos como uno de los tipos de datos que se manejan o la siguiente cita:

Por lo tanto, al interpretar nombres de archivos, cookies o cualquier otra cosa donde pueda aparecer algo como la combinación å, las comparaciones ordinales siguen ofreciendo el comportamiento más transparente y adecuado.

Espera que esto ayude, Boaz.


Puede usar InvariantCulture (consulte ).

En tu ejemplo:

FileA.Equals(FileB,StringComparison.InvariantCultureIgnoreCase )