.NET Comment comparer deux chaînes représentant des noms de fichiers ignorant la casse correctement

Etant donné que (du moins sur NTFS) le système de fichiers sous Windows est insensible à la casse, j’aimerais comparer Ssortingng fileA à Ssortingng fileB tant que tel:

 fileA.Equals(fileB, SsortingngComparison.CurrentCultureIgnoreCase) 

La question devient alors quelle culture je dois utiliser, la culture actuelle par défaut (ui?) Suffit-elle? Je n’arrive pas à trouver de méthode BCL à cette fin.

Vous devez utiliser SsortingngComparison.OrdinalIgnoreCase , comme indiqué dans Meilleures pratiques pour l’utilisation de chaînes dans le .NET Framework (recherchez “chemins de fichiers” pour trouver la section appropriée).

Si vous utilisez une culture pour faire correspondre les chaînes, vous pouvez obtenir une sitation où, par exemple, les noms “häl.gif” et “hal.gif” seraient considérés comme une correspondance.

Marcus,

Vous voudrez peut-être consulter la réponse à une autre question StackOverflow, qui est très similaire: Comparaison de noms de fichiers Win32 , qui mentionne à son tour http://www.siao2.com/2005/10/17/481600.aspx .

Après avoir suivi un lien dans une autre réponse à la même question et approfondi, je suis tombé sur l’article MSDN suivant http://msdn.microsoft.com/en-us/library/ms973919.aspx . Cela vaut la peine d’être lu en général, mais s’agissant de la comparaison des noms de fichiers, il est recommandé d’utiliser SsortingngComparison.OrdinalIgnoreCase. Voir le tableau 1 de l’article, qui contient les chemins d’access aux fichiers en tant que l’un des types de données gérés ou la citation suivante:

Ainsi, lors de l’interprétation des noms de fichiers, des cookies ou de tout autre élément pouvant contenir une combinaison telle que la combinaison å, les comparaisons ordinales offrent toujours le comportement le plus transparent et le plus approprié.

Espère que cela aide, Boaz

Ce n’est pas possible de faire de manière fiable.

Oui, la conversion de casse pour le système de fichiers est sensible à la casse.

Mais la table de conversion de casse est stockée sur le système de fichiers lui-même (pour NTFS) et change d’une version à l’autre (par exemple, la table de conversion de cas Vista a été scope au niveau Unicode 5, de sorte que Vista NTFS et XP NTFS ont des règles de conversion de casse différentes. ).

Et ce qui compte, c’est le système d’exploitation qui a formaté le système de fichiers, pas le système d’exploitation actuel.

Vous pouvez ensuite rencontrer toutes sortes de problèmes avec d’autres systèmes de fichiers (Mac OS effectue une sorte de normalisation Unicode (et non la norme)), Linux ne fait rien, mais Samba (implémentant le protocole de partage de fichiers Windows). Et a d’autres tables que Windows.

Alors que se passe-t-il si je mappe une lettre sur un disque réseau partagé par Linux ou Mac OS?

En général, vous ne devriez jamais essayer de comparer les noms de fichiers. Si vous voulez savoir s’il existe, essayez d’y accéder.

Peut-être que vous pourriez essayer ceci: http://msdn.microsoft.com/en-us/library/zkcaxw5y.aspx

Vous pouvez utiliser InvariantCulture (consultez http://msdn.microsoft.com/en-us/library/4c5zdc6a.aspx ).

Dans votre exemple:

 FileA.Equals(FileB,SsortingngComparison.InvariantCultureIgnoreCase ) 

J’ai essayé ça.

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