2009-11-18 8 views
13

Teniendo en cuenta que (al menos en NTFS) el sistema de archivos en Windows es sensible a mayúsculas, me gusta comparar String fileA a String fileB como tal:.NET Cómo comparar dos cadenas que representan los nombres de fichero caso ignorando correctamente

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.

+0

para tales fines, siempre Me sugieren CultureInfo.InvariantCulture –

Respuesta

19

Debe utilizar StringComparison.OrdinalIgnoreCase, tal como se detalla en Best Practices for Using Strings in the .NET Framework (búsqueda de "rutas de archivos" para encontrar la sección correspondiente).

Si utiliza una referencia cultural para hacer coincidir las cadenas, puede entrar en una situación donde, por ejemplo, los nombres "häl.gif" y "hal.gif" se considerarían una coincidencia.

+2

Responde la pregunta. No se debe usar cultura Las comparaciones de nombre de archivo NTFS son ordinales. –

+0

Traté de encontrar una declaración oficial en MSDN apoyando esto pero no pude. Si alguien encuentra uno, conéctelo. –

+1

Parece ser compatible con http://msdn.microsoft.com/en-us/library/dd465121.aspx –

1

Marcus,

Es posible que desee ver en la respuesta a otra pregunta StackOverflow, que es muy similar: Win32 File Name Comparison, 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 profundizando más, encontré el siguiente artículo de MSDN http://msdn.microsoft.com/en-us/library/ms973919.aspx. Vale la pena leerlo en general, pero cuando se trata de la comparación de nombre de archivo, recomienda utilizar StringComparison.OrdinalIgnoreCase. Consulte la Tabla 1 en el artículo, que contiene rutas de archivos como uno de los tipos de datos manejados o la siguiente cita:

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

Las esperanzas que esto ayude, Boaz

1

Esto no es posible hacerlo de forma fiable.

Sí, la conversión de mayúsculas y minúsculas 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 sistema de archivos (para NTFS) y cambia entre versiones (por ejemplo, la tabla de conversión de Vista se llevó al nivel Unicode 5, por lo que Vista NTFS y XP NTFS diferentes reglas de conversión de casos).

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

Luego puede encontrarse con todo tipo de problemas con otros sistemas de archivos (Mac OS realiza algún tipo de normalización Unicode (no el estándar)), Linux no hace nada, pero Samba (implementa el protocolo para compartir archivos de Windows) hace. Y tiene otras tablas que Windows.

¿Qué sucede si mapeo una letra en un disco de red compartido por Linux o Mac OS?

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

0

Intenté esto.

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

Mejor aún 'Path.GetFullPath (path1) .TrimEnd (Path.DirectorySeparatorChar) .Equals (Path.GetFullPath (path2) .TrimEnd (Path.DirectorySeparatorChar))' – SensorSmith

Cuestiones relacionadas