Winapi Win32文件名比较

Winapi Win32文件名比较,winapi,case-insensitive,Winapi,Case Insensitive,有人知道Win32在处理不区分大小写的文件名时使用什么区域性设置吗 这是根据用户的区域性而变化的东西,还是Win32使用的区域性大小写规则是不变的?下面是一个大概的答案 基本上,建议将两个字符串都大写(使用或),然后使用二进制比较(即memcmp或wmemcmp,而不是与固定区域设置进行比较)。文件系统不执行Unicode规范化,并且大小写规则不依赖于区域设置 在处理不同版本的Unicode中大小写规则发生变化的字符时,会出现令人遗憾的模棱两可的情况,但这已经是你所能做到的了。关于这个主题,有

有人知道Win32在处理不区分大小写的文件名时使用什么区域性设置吗


这是根据用户的区域性而变化的东西,还是Win32使用的区域性大小写规则是不变的?

下面是一个大概的答案

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

在处理不同版本的Unicode中大小写规则发生变化的字符时,会出现令人遗憾的模棱两可的情况,但这已经是你所能做到的了。

关于这个主题,有几篇很好的博客文章。第一个是用于OrdinalingOreCaseComarestrings的C/C++代码,第二个告诉您如何不总是适用于文件名,以及如何减轻这种情况

还有Unicode问题。虽然这些新的
ordinallingorecase
字符串比较算法非常适合本地NTFS驱动器,但它们可能无法在FAT驱动器或网络共享上给出正确答案

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


如果您使用的是.NET,Microsoft的官方建议是用于比较和规范化(稍后使用
序数
比较)。这也适用于注册表项和值、环境变量等

有关更多详细信息,请参阅

请注意,虽然它在NTFS上是可靠的,但例如,它在网络共享中可能会失败。有关解决方案,请参见@SteveSteiner帖子中的答案和链接