Win32文件名比较

时间:2009-01-04 05:18:36

标签: winapi case-insensitive

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

这是根据用户的文化而变化的,还是Win32使用文化不变的大小写规则?

3 个答案:

答案 0 :(得分:6)

大致回答是 Comparing Unicode file names the right way

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

在处理不同版本的Unicode时套管规则已经发生变化的字符时,会出现令人遗憾的模糊情况,但这种情况与您能做的一样好。

答案 1 :(得分:6)

Comparing file names in native codeDon'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的答案,并在他的帖子中找到解决方案的链接。