Win32文件名比较

18

有人知道Win32处理大小写不敏感文件名时使用的文化设置吗?

这是否取决于用户的文化,或者Win32使用的大小写规则是文化无关的?

4个回答

8
一个近似的答案在正确比较Unicode文件名中。
基本上,建议是将两个字符串均转换为大写(使用CharUpperCharUpperBuffLCMapString),然后使用二进制比较(即使用memcmp或wmemcmp,而不是带有不变语言环境的CompareString)。文件系统不执行Unicode规范化,并且大小写规则不依赖于区域设置。
处理那些在不同版本的Unicode中大小写规则发生变化的字符时,存在不幸的模糊情况,但这已经是你能做到的最好程度。

6

比较本地代码中的文件名不要比较文件名是关于此主题的几篇很好的博客文章。第一篇提供了OrdinalIgnoreCaseCompareStrings的C/C++代码,第二篇告诉你它在文件名上并不总起作用,并介绍了如何减轻它的影响。

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

那么答案是什么呢?在可能的情况下,让文件系统告诉您。 CreateFile可以告诉您给定的文件名是否存在。只需选择正确的创建模式即可。如果需要比较句柄,通常可以使用GetFileInformationByHandle;查看dwVolumeSerialNumber/nFileIndexHigh/nFileIndexLow


4

0
根据Windows Driver Samples FastFAT和CDFS,它使用RtlUpcaseUnicodeString将字符串转换为大写。根据Ghidra的简要查看,它使用名为NLS_UPCASE的内部函数,其行为基于您当前的系统代码页。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接