Meh*_*dad 21 c winapi path path-separator
tl; dr:我如何询问Windows系统上当前的目录分隔符是什么?
不同版本的Windows似乎表现不同(例如\,/两者都在英文版本上工作,¥显然是在日文版本上,₩显然是在韩文版本上等...
有没有办法避免硬编码,而是在运行时询问Windows?
理想情况下,解决方案应该不依赖于高层次的DLL一样ShlWAPI.dll,因为下级库也取决于此.所以它应该要么依赖于kernel32.dll或ntdll.dll或等等......虽然我有一个很难找到任何东西可言,无论是在高位还是处于较低的水平.
一些小实验告诉我,它是Win32子系统(即kernel32.dll......或者它可能RtlDosPathNameToNtPathName_U在ntdll.dll?不确定,没有测试...),它将正斜杠转换为反斜杠,而不是内核.(前缀\\?\使得以后在路径中无法使用正斜杠 - 而NT本机用户模式API也会因正斜杠而失败.)
所以显然它不是"内置于"Windows,而只是一个兼容性功能 - 这意味着你不能盲目地用斜线代替反斜杠,因为任何随机前缀\\?\到路径的程序都会自动在正斜杠上打破.
我对这个问题的结论有不同的感受,但我只是想我会提到它.
(我将其标记为"路径分隔符",即使这在技术上是不正确的,因为路径分隔符用于分隔路径,而不是目录(;vs. \).希望人们得到我的意思.)
wkl*_*wkl 35
虽然?和¥字符在各自的韩文和日文版本中显示为目录分隔符符号,但它们只是这些版本的Windows表示与U+005c字形相同的Unicode代码点的方式.反斜杠的基础代码点在英语Windows以及日语和韩语Windows版本中仍然相同.
可以在此页面上找到对此的额外确认:http://msdn.microsoft.com/en-us/library/dd374047(v = vs.85).aspx
文件名中字符集的安全注意事项
在日语系统上使用的Windows代码页和OEM字符集包含Yen符号(
¥)而不是反斜杠(\).因此,日元字符是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-接受-正斜杠的路径分隔