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
......或者RtlDosPathNameToNtPathName_U
中可能是ntdll.dll
?不确定,没有测试......)它将正斜杠转换为反斜杠,而不是内核。 (前缀\\?\
使得以后在路径中无法使用正斜杠 - 而NT本机用户模式API也会因正斜杠而失败。)
所以显然它不是“内置于”Windows,而只是一个兼容性功能 - 这意味着你不能盲目地用斜杠代替反斜杠,因为任何随机前缀\\?\
到路径的程序都将自动打破正斜杠。
我对这方面的结论有不同的感受,但我只是想我会提到它。
(我将其标记为“路径分隔符”,即使这在技术上不正确,因为路径分隔符用于分隔路径,而不是目录(;
与{{1希望人们得到我的意思。)
答案 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(包括苹果电脑)。只需在任何地方使用正斜杠。