.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?
В общем, вы никогда не должны пытаться сравнивать имена файлов. Если вы хотите узнать, есть ли там, попытайтесь получить к нему доступ.
Ответ 4
Возможно, вы могли бы попробовать это:
http://msdn.microsoft.com/en-us/library/zkcaxw5y.aspx
Ответ 5
Вы можете использовать InvariantCulture (смотрите http://msdn.microsoft.com/en-us/library/4c5zdc6a.aspx).
В вашем примере:
FileA.Equals(FileB,StringComparison.InvariantCultureIgnoreCase )
Ответ 6
Я пробовал это.
Path.GetFullPath(path1).Equals(Path.GetFullPath(path2))