Win32 Сравнение имен файлов - PullRequest
13 голосов
/ 04 января 2009

Кто-нибудь знает, какие настройки культуры использует Win32 при работе с именами файлов без учета регистра?

Это зависит от культуры пользователя или правила оболочки, которые использует Win32, инвариантны для культуры?

Ответы [ 3 ]

6 голосов
/ 04 января 2009

Сравнение имен файлов в собственном коде и Не сравнивайте имена файлов - пара хороших сообщений в блоге на эту тему. Первый содержит код C / C ++ для OrdinalIgnoreCaseCompareStrings, а второй рассказывает, как это не всегда работает для имен файлов и что нужно сделать, чтобы смягчить это.

Тогда есть проблемы с Unicode. Хотя эти новые OrdinalIgnoreCase алгоритмы сравнения строк отлично подходят для вашего локального диска NTFS, они могут не дать правильный ответ на диске FAT или в общей сетевой папке.

Так, каков ответ? По возможности пусть файловая система скажет вам. CreateFile может сказать вам, существует ли данное имя файла. Просто выберите правильное расположение творения. Если вам нужно сравнить с ручками, вы часто можете использовать GetFileInformationByHandle; посмотрите на dwVolumeSerialNumber / nFileIndexHigh / nFileIndexLow.

6 голосов
/ 04 января 2009

Примерный ответ на Правильное сравнение имен файлов Unicode .

Как правило, рекомендуется вводить обе строки в верхнем регистре (используя CharUpper, CharUpperBuff или LCMapString), а затем сравнивать, используя двоичное сравнение (то есть memcmp или wmemcmp, а не CompareString с инвариантной локалью). Файловая система не выполняет нормализацию Unicode, и правила регистра не зависят от настроек локали.

Есть неприятные неоднозначные случаи при работе с персонажами, правила корпусов которых изменились в разных версиях Unicode, но это примерно так же хорошо, как вы можете.

4 голосов
/ 21 декабря 2014

Если вы используете .NET , официальная рекомендация Microsoft - использовать StringComparison.OrdinalIgnoreCase для сравнения и ToUpperInvariant для нормализации (для быть позже сравненным, используя Ordinal сравнение). Это также относится к ключам и значениям реестра, переменным среды и т. Д.

Подробнее см. Новые рекомендации по использованию строк в Microsoft .NET 2.0 .

Обратите внимание, что, хотя он надежен в NTFS, он может не работать с сетевыми ресурсами, например. См. Ответ @ SteveSteiner и ссылки в его сообщении для решений.

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