Сравнение и сортировка имен файлов Unicode - PullRequest
3 голосов
/ 17 февраля 2010

Использование компонентов Delphi 2007 и TMS для утилит и интерфейса Unicode (обновление до Delphi 2009 для поддержки Unicode не предусмотрено).

Я храню список имен файлов в списке строк (TTntStringList). Это отсортировано и нечувствительно к регистру. Процедура сортировки по умолчанию использует CompareStringW (LOCALE_USER_DEFAULT, NORM_IGNORECASE, ...) для сравнения строк (и то же самое для Find). Однако это проблема, потому что это будет приравнивать dummyss.txt к dummyß.txt (например), но в NTFS совершенно законно, чтобы эти два файла находились в одной папке, то есть они рассматриваются как разные имена.

Насколько я понимаю, в Vista и новее правильным способом сравнения имен файлов является использование CompareStringOrdinal. Это правильно?

В системах, предшествующих Vista, что будет правильным? Я считаю, что это должно быть CompareStringW (LOCALE_INVARIANT, ...), но я не совсем уверен.

Спасибо

1 Ответ

3 голосов
/ 17 февраля 2010

Цитата из статьи MSDN Обработка сортировки в ваших приложениях :

CompareStringOrdinal сравнивает два Строки Unicode для проверки на двоичный равенство, в отличие от языкового равенство. Примеры таких Нелингвистические строки в NTFS файле имена, ...

CompareStringOrdinal требует Windows Vista или более позднюю версию.

Редактировать: Да, кажется , что в Windows, предшествующей Vista, вы можете использовать RtlCompareUnicodeString , который также используется внутри CompareStringOrdinal и доступен начиная с Windows NT.

...