代码之家  ›  专栏  ›  技术社区  ›  Scott Wisniewski

Win32文件名比较

  •  13
  • Scott Wisniewski  · 技术社区  · 16 年前

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

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

    3 回复  |  直到 16 年前
        1
  •  8
  •   Paul    4 年前

    大致答案见 Comparing Unicode file names the right way .

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

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

        2
  •  6
  •   Chronial    4 年前

    Comparing file names in native code Don't compare filenames 有几篇关于这个话题的好博客文章。第一个是用于OrdinalingOreCaseComarestrings的C/C++代码,第二个告诉您如何不总是适用于文件名,以及如何减轻这种情况。

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

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

        3
  •  4
  •   Athari    10 年前

    如果你正在使用 StringComparison.OrdinalIgnoreCase 作比较及 ToUpperInvariant 用于规范化(稍后使用 Ordinal 比较)。这也适用于注册表项和值、环境变量等。

    New Recommendations for Using Strings in Microsoft .NET 2.0 更多细节。

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