有没有人知道Win32在处理不区分大小写的文件名时使用的文化设置?
这是根据用户的文化而变化的,还是Win32使用文化不变的大小写规则?
一个近似的答案是以 正确的方式比较Unicode文件名.
基本上,建议大写两个字符串(使用CharUpper
,, CharUpperBuff
或LCMapString
),然后使用二进制比较(即memcmp或wmemcmp,而不是CompareString与不变的语言环境)进行比较.文件系统不执行Unicode规范化,并且案例规则不依赖于区域设置.
在处理不同版本的Unicode时套管规则已经发生变化的字符时,会出现令人遗憾的模糊情况,但这种情况与您能做的一样好.
比较本机代码中的文件名和不比较文件名是关于此主题的几篇好博文.第一个包含OrdinalIgnoreCaseCompareStrings的C/C++代码,第二个告诉您如何对文件名不起作用,以及如何缓解这个问题.
然后是Unicode问题.虽然这些新的
OrdinalIgnoreCase
字符串比较算法非常适合您的本地NTFS驱动器,但它们可能无法在您的FAT驱动器或网络共享上产生正确的答案.那么答案是什么?如果可能,让文件系统告诉你.
CreateFile
可以告诉你是否存在给定的文件名.只需选择正确的创作配置.如果你需要比较句柄,你经常可以使用GetFileInformationByHandle
; 看看dwVolumeSerialNumber
/nFileIndexHigh
/nFileIndexLow
.