.NET. Как сравнить две строки, которые представляют имена файлов, игнорируя регистр правильно

Учитывая, что (по крайней мере, в NTFS) файловая система на Windows нечувствительна к регистру, я хотел бы сравнить String fileA с String fileB как таковой:

fileA.Equals(fileB, StringComparison.CurrentCultureIgnoreCase)

Затем возникает вопрос, какую культуру я должен использовать, достаточно ли текущей (ui?) культуры по умолчанию? Кажется, я не могу найти какие-либо методы BCL для этой цели.

Ответ 1

Вы должны использовать StringComparison.OrdinalIgnoreCase, как описано в "Рекомендации по использованию строк в .NET Framework" (поиск "путей к файлам" ) чтобы найти соответствующий раздел).

Если вы используете культуру для сопоставления строк, вы можете попасть в позицию, где, например, имена "häl.gif" и "hal.gif" будут считаться совпадением.

Ответ 2

Марк,

Возможно, вы захотите посмотреть ответ на другой вопрос StackOverflow, который очень похож: Сравнение файлов Win32 File, в котором упоминается http://www.siao2.com/2005/10/17/481600.aspx.

Следуя ссылке в другом ответе на тот же вопрос и копая дальше, я наткнулся на следующую статью MSDN http://msdn.microsoft.com/en-us/library/ms973919.aspx. Это стоит прочитать в целом, но когда дело доходит до сравнения имен файлов, рекомендуется использовать StringComparison.OrdinalIgnoreCase. См. Таблицу 1 в статье, которая содержит пути к файлам как один из обработанных типов данных или следующую цитату:

Таким образом, при интерпретации имен файлов, файлов cookie или чего-либо еще, где может отображаться что-то вроде комбинации å, порядковые сравнения по-прежнему обеспечивают наиболее прозрачное и подходящее поведение.

Надеется, что это поможет, Боаз

Ответ 3

Это невозможно сделать надежно.

Да, преобразование case для файловой системы нечувствительно к регистру.

Но таблица преобразования case хранится в самой файловой системе (для NTFS), и она изменяется между версиями (например, таблица преобразования случая Vista была перенесена на уровень Unicode 5, поэтому Vista NTFS и XP NTFS имеют разные правила преобразования кода).

И все, что имеет значение, - это ОС, отформатировавшая файловую систему, а не текущую ОС.

Затем вы можете столкнуться со всеми проблемами с другими файловыми системами (Mac OS выполняет некоторую нормализацию Unicode (не стандартную)), Linux ничего не делает, но Samba (реализующий протокол обмена файлами Windows), И имеет другие таблицы, кроме Windows.

Итак, что произойдет, если я сопоставляю письмо с сетевым диском, разделяемым Linux или Mac OS?

В общем, вы никогда не должны пытаться сравнивать имена файлов. Если вы хотите узнать, есть ли там, попытайтесь получить к нему доступ.

Ответ 6

Я пробовал это.

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