【发布时间】:2011-09-06 03:22:56
【问题描述】:
tl;dr:如何询问 Windows 系统上当前的目录分隔符是什么?
不同版本的 Windows 似乎表现不同(例如,\ 和 / 都适用于英文版本,¥ is apparently on the Japanese version, ₩ is apparently on the Korean version 等...
有什么办法可以避免硬编码,而是在运行时询问 Windows?
注意:
理想情况下,解决方案应该不依赖于像 ShlWAPI.dll 这样的高级 DLL,因为低级库也依赖于此。所以它应该真的取决于kernel32.dll 或ntdll.dll 或类似的东西......尽管我很难找到任何东西,无论是在高级别还是在低级别。
编辑:
一个小实验告诉我,它是 Win32 子系统(即 kernel32.dll... 还是 ntdll.dll 中的 RtlDosPathNameToNtPathName_U?不确定,没有测试...)将正斜杠转换为反斜杠,而不是内核。 (前缀 \\?\ 使得后面的路径中无法使用正斜杠 - 并且 NT 原生用户模式 API 也会因正斜杠而失败。)
所以显然它不是完全“内置”在 Windows 中,而只是一个兼容性功能——这意味着你不能盲目地用斜杠代替反斜杠,因为任何在路径上随机添加 \\?\ 前缀的程序都会自动中断在正斜杠上。
我对对此做出什么结论感到复杂,但我只是想提一下。
(我将其标记为“路径分隔符”,尽管这在技术上是不正确的,因为路径分隔符用于分隔 路径,而不是目录(; 与 \)。希望人们明白我的意思。)
【问题讨论】:
-
分隔符是一样的。总是
0x5c。不同之处在于用于显示字符的代码页。在 ANSI 代码页中,0x5c是反斜杠。在日文代码页 932 中,0x5c 是日元符号,而在韩文代码 (949) 页中,它是韩元符号。 -
我同意 vcsjones,Path handling 的文档提到它是分隔目录的反斜杠 (0x5c)。事实上,如果您将机器切换到日语语言环境,按 \ 键将产生 ¥ 而不是 \。
-
@vcsjones, Joshua:我没有意识到是这种情况,感谢您指出。但是,我仍然需要一种机制来检测
/(或其他字符)是否是路径分隔符——在 Windows 7 上似乎是这样,但在 XP 上却不是,我宁愿避免硬编码这条规则如果可能的话。
标签: c winapi path path-separator