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

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


不同版本的Windows似乎表现不同(例如\/都在英文版本上工作, ¥显然是在日文版本上,₩显然是在韩文版本上等等…

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

注意:

理想情况下,解决方案不应该依赖于像ShlWAPI.dll这样的高级DLL,因为较低级别的库也依赖于此。 所以它应该真的要么依赖于kernel32.dll还是ntdll.dll之类的东西……尽管我找不到任何东西 ,无论是在高水平还是在低水平。

编辑:

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

所以显然它并没有完全“内置”到Windows中,而只是一个兼容性function – 这意味着你不能盲目地用斜线代替反斜杠,因为任何随机前缀\\?\到路径的程序都会自动向前突破斜杠。

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

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

虽然¥字符在各自的韩语和日语Windows版本中显示为目录分隔符符号,但它们只是这些版本的Windows如何表示与字形相同的Unicode代码点U+005c 。 反斜杠的基础代码点在英语Windows以及日语和韩语Windows版本中仍然相同。

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

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

在日语系统上使用的Windows代码页和OEM字符集包含日元符号( ¥ )而不是反斜杠( \ )。 因此,日元字符是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应支持在API函数中使用/作为目录分隔符,但不一定在命令提示符( command.com )中。

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

弄清楚这一切的真相很难,但这可能是关于/在Windows路径中的一个非常有用的链接: http : //bytes.com/topic/python/answers/23123-when-did-windows-start -accepting-正斜杠的路径分隔

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

如果原始问题打算询问内核模式,那么依赖/成为路径分隔符可能不是一个好主意。 不同的文件系统允许磁盘上的不同字符集。 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,多字节字符可以比两个字符长。

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