2009-01-04 75 views
13

有没有人知道Win32在处理不区分大小写的文件名时使用的文化设置?Win32文件名比较

这是根据用户的文化而变化的,还是Win32使用文化不变性的外壳规则?

回答

6

近似的答案是 Comparing Unicode file names the right way

基本上,建议是大写两个字符串(使用CharUpperCharUpperBuff,或LCMapString),然后使用二进制比较比较(即memcmp或wmemcmp,不与不变区域CompareString)。文件系统不执行Unicode规范化,并且大小写规则不依赖于区域设置。

在处理字符的套管规则在不同版本的Unicode中发生变化时,会出现不幸的不明确情况,但它与您所能做的一样好。

6

Comparing file names in native codeDon't compare filenames是一个关于这个主题的好博客帖子。第一个是用于OrdinalIgnoreCaseCompareStrings的C/C++代码,第二个告诉你如何不一直对文件名工作,以及如何缓解这个问题。

然后是Unicode问题。虽然这些新的OrdinalIgnoreCase字符串比较算法适用于本地NTFS驱动器,但它们可能无法在您的FAT驱动器或网络共享上产生正确的答案。

那么答案是什么?如果可能,让文件系统告诉你。 CreateFile可以告诉你给定的文件名是否存在。只要选择正确的创作处理。如果你需要比较手柄,你可以经常使用GetFileInformationByHandle;看看dwVolumeSerialNumber/nFileIndexHigh/nFileIndexLow