В Рекомендации по использованию строк в .NET Framework, StringComparison OrdinalIgnoreCase
рекомендуется для путей к файлам без учета регистра. (Назовем это Утверждение А.)
Я могу с этим согласиться, потому что я могу создать два файла в одном каталоге:
é.txt
é.txt
Их имена файлов не совпадают, второе состоит из e
и модификатора, так что на самом деле оно состоит из двух букв. (Вы можете попробовать сами, используя копипаст.)
Если бы действовало сравнение инвариантных культур (а не порядковое сравнение), NTFS не разрешила бы эти файлы, потому что в той же статье объясняется, что в инвариантных культурах a + ̊ = å
Но в статье на String.ToUpperInvariant()
есть другая рекомендация: (Утверждение Б.)
Если вам нужна строчная или прописная версия идентификатора операционной системы, например имени файла, именованного канала или раздела реестра, используйте методы ToLowerInvariant или ToUpperInvariant.
Мне нужно создать коллекцию путей к файлам (фактически HashSet
) для обнаружения дубликатов. Так что, если я буду подчиняться инструкции B при создании карты, я могу закончить с ложными срабатываниями, потому что вышеупомянутые имена файлов é.txt
и é.txt
будут считаться одним. Правильно ли я понимаю, что утверждение B, найденное в MSDN, вводит в заблуждение? Или я что-то упускаю?
Я собираюсь создать библиотеку, желательно без известных ошибок с самого начала, поэтому я просто не хочу пренебрегать этим.
Обновлять:
В заявлении B, кажется, есть еще одна проблема: ToLowerInvariant() на самом деле нельзя использовать. Причина (цитирую статью с рекомендациями): DO: Use ToUpperInvariant rather than ToLowerInvariant when normalizing strings for comparison.
Фактическая причина: There is a small range of characters that do not roundtrip, and going to lowercase will make these characters unavailable.
(источник)
:
,*
или?
в именах файлов. Просто винда его не поддерживает. Создать такие файлы в NTFS под Linux довольно просто. - person Thomas Weller   schedule 23.09.2015