К сожалению, имена каталогов / файлов в Windows не чувствительны к регистру.
Когда я сравниваю текст (ввод от пользователя) с именем каталога (из CFileFind
), как я могу проверить, являются ли онизначит один и тот же каталог или нет?Например, C:\PIPPO\
и C:\Pippo\
- это один и тот же каталог, в то время как C:\Pippò\
- это не одно и то же (последний имеет акцент).
Я пытаюсь:
if(CompareString(LOCALE_INVARIANT,NORM_IGNORECASE,q,-1,data_from_CfileFind->txt.GetBuffer(),-1)==CSTR_EQUAL)
(q
является [частью] пользовательского ввода)
Это «вид работ», так как он распознает как один и тот же каталог варианты регистров латинского, греческого и кириллического алфавитов, но это сбивает с толку "weiß"
и "weiss"
(и это две разные директории на моем диске), так что это ненадежно.
[неудачный тест основан на Сравнение и сортировка имен файлов Unicode : я прочиталэто, но не нашел подходящего решения - ссылки, кажется, не работают)
(я также прочитал Windows Invariant Culture Puzzle но, боюсь, я не совсем понял о "культурах"").
Есть какие-нибудь предложения?
Может быть, мне стоит позвонить CompareString()
с другими параметрами?Или есть лучший, более простой подход?
Обратите внимание, что мне не нужно сортировать имена: я просто хотел бы проверить, означают ли они один и тот же каталог (или файл) для Windows или нет.
Под «Windows» я имею в виду 2000 (или, по крайней мере, XP) и более поздние версии.
EDIT (извините, вопрос не был задан в первый раз)
1) Не гарантируется, что введенный пользователем путь ссылается на реально существующий каталог (в этом случае, конечно, они не один и тот же каталог).
2) Я знаю, что файлы и каталоги могут называться очень разными именами из-за ссылок (жестких или программных), subst
s, доступа к сети с другим именем или IP на один и тот же компьютер и т. Д., Но ...Я не прошу выявлять все эти случаи.Все, что я хотел бы проверить, это то, что имя, написанное пользователем, является изменением регистра другого существующего варианта (и, например, Windows скажет мне, что файл уже существует, если я попытаюсь создать его с тем же именем).но другой случай).
2-е РЕДАКТИРОВАНИЕ
Это делает работу (по крайней мере, в тех случаях, которые я пытался):
if(CompareStringOrdinal(q,-1,data_from_CfileFind->txt.GetBuffer(),-1,1)==CSTR_EQUAL)
Но CompareStringOrdinal()
недоступно в старых версиях Windows.Есть ли эквивалент?