有人知道Win32处理大小写不敏感文件名时使用的文化设置吗?
这是否取决于用户的文化,或者Win32使用的大小写规则是文化无关的?
有人知道Win32处理大小写不敏感文件名时使用的文化设置吗?
这是否取决于用户的文化,或者Win32使用的大小写规则是文化无关的?
CharUpper
、CharUpperBuff
或LCMapString
),然后使用二进制比较(即使用memcmp或wmemcmp,而不是带有不变语言环境的CompareString)。文件系统不执行Unicode规范化,并且大小写规则不依赖于区域设置。比较本地代码中的文件名和不要比较文件名是关于此主题的几篇很好的博客文章。第一篇提供了OrdinalIgnoreCaseCompareStrings的C/C++代码,第二篇告诉你它在文件名上并不总起作用,并介绍了如何减轻它的影响。
接下来是Unicode问题。虽然这些新的OrdinalIgnoreCase字符串比较算法对于您的本地NTFS驱动器非常有用,但它们可能无法在FAT驱动器或网络共享中产生正确的答案。
那么答案是什么呢?在可能的情况下,让文件系统告诉您。
CreateFile
可以告诉您给定的文件名是否存在。只需选择正确的创建模式即可。如果需要比较句柄,通常可以使用GetFileInformationByHandle
;查看dwVolumeSerialNumber
/nFileIndexHigh
/nFileIndexLow
。
StringComparison.OrdinalIgnoreCase
进行比较,并使用ToUpperInvariant
进行规范化(稍后使用Ordinal
比较)。这也适用于注册表键和值、环境变量等。RtlUpcaseUnicodeString
将字符串转换为大写。根据Ghidra的简要查看,它使用名为NLS_UPCASE
的内部函数,其行为基于您当前的系统代码页。