有没有人知道Win32在处理不区分大小写的文件名时使用的文化设置?
这是根据用户的文化而变化的,还是Win32使用文化不变的大小写规则?
答案 0 :(得分:6)
大致回答是 Comparing Unicode file names the right way
基本上,建议大写两个字符串(使用CharUpper
,CharUpperBuff
或LCMapString
),然后使用二进制比较(即memcmp或wmemcmp,而不是CompareString与不变的现场)。文件系统不执行Unicode规范化,并且案例规则不依赖于区域设置。
在处理不同版本的Unicode时套管规则已经发生变化的字符时,会出现令人遗憾的模糊情况,但这种情况与您能做的一样好。
答案 1 :(得分:6)
Comparing file names in native code和Don't compare filenames是关于此主题的几篇好文章。第一个是OrdinalIgnoreCaseCompareStrings的C / C ++代码,第二个告诉你如何对文件名不起作用以及如何减轻它。
然后是Unicode问题。虽然这些新的
OrdinalIgnoreCase
字符串比较算法非常适合您的本地NTFS驱动器,但它们可能无法在您的FAT驱动器或网络共享上产生正确的答案。那么答案是什么?如果可能,让文件系统告诉你。
CreateFile
可以告诉您是否存在给定的文件名。只需选择正确的创作配置。如果您需要与句柄进行比较,通常可以使用GetFileInformationByHandle
;查看dwVolumeSerialNumber
/nFileIndexHigh
/nFileIndexLow
。
答案 2 :(得分:4)
如果您正在使用 .NET ,Microsoft的官方建议是使用StringComparison.OrdinalIgnoreCase
进行比较,使用ToUpperInvariant
进行规范化(稍后使用{进行比较{1}}比较)。这也适用于注册表项和值,环境变量等。
有关详细信息,请参阅New Recommendations for Using Strings in Microsoft .NET 2.0。
请注意,虽然它在NTFS上可靠,但它可能会因网络共享而失败。请参阅@ SteveSteiner的答案,并在他的帖子中找到解决方案的链接。