【发布时间】:2019-04-24 22:31:08
【问题描述】:
很遗憾,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"(它们是我光盘上的两个不同目录),所以不可靠。
[失败的测试受到Comparing and sorting Unicode filenames 的启发:我已阅读,但没有找到合适的解决方案——链接似乎不起作用)
(我也读过Windows Invariant Culture Puzzle,但恐怕我没有完全理解“文化”)。
有什么建议吗?
也许我应该用不同的参数调用CompareString()?还是有更好、更简单的方法?
请注意,我不需要对名称进行排序:我只想检查它们对于 Windows 是否意味着相同的目录(或文件)。
“Windows”是指 2000 年(或至少是 XP)及更高版本。
EDIT(抱歉,第一次问得不好)
1) 用户输入的路径不保证指向一个实际存在的目录(当然,在这种情况下,它们不是同一个目录)。
2) 我知道文件和目录可以用非常不同的名称来引用,因为链接(硬链接或软链接)、substs、以不同名称或 IP 访问同一台计算机的网络等...但我并不是要检测所有这些情况。
我只想检查用户编写的名称是否是另一个现有名称的大小写变体(因此,例如,如果我尝试创建具有相同名称的文件,Windows 会告诉我该文件已经存在但情况不同)。
第二次编辑
这可以完成工作(至少在我尝试过的情况下):
if(CompareStringOrdinal(q,-1,data_from_CfileFind->txt.GetBuffer(),-1,1)==CSTR_EQUAL)
但CompareStringOrdinal() 在旧版 Windows 中不可用。
有没有等价的?
【问题讨论】: