Windows系统中如何判断两个char*类型的文件路径是否相同?
Windows下使用
_stricmp比较路径是否相等的可靠性分析 _stricmp不是判断Windows路径等价的可靠方案,无论是纯ASCII场景还是包含多语言字符的场景都存在明显缺陷。
为什么_stricmp不可靠
- 多语言字符支持不足:
_stricmp仅对ASCII范围内的[A-Za-z]字符做大小写映射,对于非拉丁语言的大小写变体(例如德语的ß与SS、法语的É与é、土耳其语的İ与i等)无法识别为等价字符,但Windows的路径大小写不敏感规则适配全Unicode字符集,会将上述合法的大小写变体判定为等价。 - 未覆盖Windows路径的特殊等价规则:
_stricmp是纯字符串比较,无法处理路径场景下的特殊等价情况,包括但不限于:- 相对路径与绝对路径的等价(当前工作目录为
C:\test时,C:\test\a.txt与.\a.txt指向同一个文件) - 长路径与8.3短路径的等价(
C:\Program Files与C:\PROGRA~1为同一个目录) - 路径分隔符差异(Windows下
/与\作为路径分隔符等价) - 末尾多余分隔符(
C:\test与C:\test\指向同一个目录)
上述情况_stricmp都会判定为路径不等,和实际的路径匹配逻辑完全不符。
- 相对路径与绝对路径的等价(当前工作目录为
正确的路径比较方案
要完全符合Windows系统的路径等价规则,建议使用系统官方提供的API实现:
- 先调用
GetFullPathNameW将两个待比较的路径转换为规范化的绝对路径,统一处理相对路径、分隔符、末尾斜杠等格式差异 - 调用
CompareStringEx函数,指定LOCALE_NAME_INVARIANT区域,传入NORM_IGNORECASE标志执行大小写不敏感的字符串比较,该API的大小写映射规则完全对齐Windows内核的路径比较逻辑,支持全Unicode字符的大小写等价判断。
如果你的运行环境是Windows 10 1709及以上版本,也可以直接使用PathCchCompareExAPI,传入合适的匹配标志即可一步完成路径等价校验。
内容的提问来源于stack exchange,提问作者ideasman42
相关产品推荐
相关产品推荐

