.NET Как сравнить две строки, которые представляют имена файлов, игнорируя регистр правильно - PullRequest
17 голосов
/ 18 ноября 2009

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

fileA.Equals(fileB, StringComparison.CurrentCultureIgnoreCase)

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

Ответы [ 6 ]

26 голосов
/ 18 ноября 2009

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

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

1 голос
/ 26 ноября 2009

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

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

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

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

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

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

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

1 голос
/ 19 ноября 2009

Марк,

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

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

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

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

0 голосов
/ 07 августа 2013

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

Path.GetFullPath(path1).Equals(Path.GetFullPath(path2))
0 голосов
/ 18 ноября 2009

Вы можете использовать InvariantCulture (см. http://msdn.microsoft.com/en-us/library/4c5zdc6a.aspx).

В вашем примере:


FileA.Equals(FileB,StringComparison.InvariantCultureIgnoreCase )
0 голосов
/ 18 ноября 2009

Может быть, вы могли бы попробовать это: http://msdn.microsoft.com/en-us/library/zkcaxw5y.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...