在Windows上获取目录分隔符char? ('\','/'等)

时间:2011-09-06 03:22:57

标签: c winapi path path-separator

tl; dr:我如何询问Windows系统上当前的目录分隔符是什么?


不同版本的Windows似乎表现不同(例如\/都适用于英文版¥ is apparently on the Japanese version, ₩ is apparently on the Korean version等...

有没有办法避免硬编码,而是在运行时询问Windows?

注意:

理想情况下, 的解决方案应该依赖于ShlWAPI.dll等高级DLL,因为较低级别的库也依赖于此。所以它应该真的要么依赖于kernel32.dllntdll.dll等等......尽管我在找到任何时遇到了麻烦,无论是在高级还是在低水平。

编辑:

一些小实验告诉我,它是Win32子系统(即kernel32.dll ......或者RtlDosPathNameToNtPathName_U中可能是ntdll.dll?不确定,没有测试......)它将正斜杠转换为反斜杠,而不是内核。 (前缀\\?\使得以后在路径中无法使用正斜杠 - 而NT本机用户模式API也会因正斜杠而失败。)

所以显然它不是“内置于”Windows,而只是一个兼容性功能 - 这意味着你不能盲目地用斜杠代替反斜杠,因为任何随机前缀\\?\到路径的程序都将自动打破正斜杠。

我对这方面的结论有不同的感受,但我只是想我会提到它。

(我将其标记为“路径分隔符”,即使这在技术上不正确,因为路径分隔符用于分隔路径,而不是目录(;与{{1希望人们得到我的意思。)

3 个答案:

答案 0 :(得分:35)

虽然¥个字符在各个韩文和日文版本的Windows版本中显示为目录分隔符符号,但它们只是这些版本的Windows代表相同的Unicode代码点的方式{{1}作为一个字形。反斜杠的基础代码点在英语Windows以及日语和韩语Windows版本中仍然相同。

可在此页面上找到对此的额外确认:http://msdn.microsoft.com/en-us/library/dd374047(v=vs.85).aspx

  

文件名中字符集的安全注意事项

     

日语系统上使用的Windows代码页和OEM字符集包含日元符号(U+005c)而不是反斜杠(¥)。因此,日元字符是NTFS和FAT文件系统的禁止字符。将Unicode映射到日语代码页时,转换函数会将反斜杠(U + 005C)和普通的Unicode Yen符号(U + 00A5)映射到此相同的字符。出于安全原因,您的应用程序通常不应允许Unicode字符串中的字符U + 00A5可能被转换为用作FAT文件名。

另外,我不知道任何Windows API函数可以获取系统的路径分隔符,但在任何情况下都可以依赖它\

http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx#naming_conventions

  

以下基本规则使应用程序能够创建和处理文件和目录的有效名称,而不管文件系统如何:

     

...

     

使用反斜杠(\)分隔路径的组件。反斜杠将文件名与路径中的文件名分开,并从路径中的另一个目录名中分隔一个目录名。您不能在实际文件或目录的名称中使用反斜杠,因为它是将名称分隔为组件的保留字符。

     

...

关于\

Windows应该support the use of /作为API函数中的目录分隔符,但不一定在命令提示符(/)中。

  

注意Windows API中的文件I / O函数将“/”转换为“\”作为将名称转换为NT样式名称的一部分,除非使用“\?\”前缀,如以下部分所述

要弄清楚这一切的真相很难,但这可能是关于Windows路径中command.com的真正有用的链接:http://bytes.com/topic/python/answers/23123-when-did-windows-start-accepting-forward-slash-path-separator

答案 1 :(得分:4)

原始海报在评论中添加了“内核模式”这个短语给别人的答案。

如果原始问题打算询问内核模式,那么依赖/成为路径分隔符可能不是一个好主意。不同的文件系统允许磁盘上的不同字符集。 Windows中的不同文件系统驱动程序也可以允许不同的字符集,这些字符集通常不包括底层文件系统在磁盘上不接受的字符,但有时它们可​​能会表现得很奇怪。例如,Posix模式允许组件名称在NTFS分区中的路径名中包含一些字符,即使NTFS通常不允许这些字符。 (但显然/不是其中之一,在Posix。)

在Unicode的内核模式下,U + 005C始终是反斜杠,它始终是路径分隔符。日元和韩元的Unicode代码点不是U + 005C,也不是路径分隔符。

在ANSI的内核模式中,根据哪个ANSI代码页出现复杂情况。在与ASCII足够相似的代码页中,0x5C是反斜杠,它是路径分隔符。在ANSI代码页932和949中,0x5C不是反斜杠,但0x5C可能是路径分隔符,具体取决于它发生的位置。如果0x5C是多字节字符的第一个字节,那么它是日元符号或赢得符号,它是路径分隔符。如果0x5C是多字节字符的第二个字节,那么它本身不是一个字符,所以它不是日元符号或赢得符号,它不是路径分隔符。您必须从字符串的开头开始解析,以确定特定的char是否实际上是整个字符。同样使用中文和UTF-8,多字节字符可以比两个字符长。

答案 2 :(得分:2)

标准正斜杠(/)一直适用于所有版本的DOS和Windows。如果您使用它,您不必担心日语和韩语版本的Windows上反斜杠的显示方式,并且您也不必特殊情况下Windows的路径分隔符而不是POSIX(包括苹果电脑)。只需在任何地方使用正斜杠。