那么在Windows下,路径斜杠的正确方向是什么?(/或\)

86

在Windows操作系统中,文件路径的反斜杠\是必须的;而在.NET的URI类中,它们被写成了正斜杠/。是否有一种正确的方式来处理文件路径的分隔符,即使在最原始的系统中也能够接受?为什么.NET的URI会使用与Windows中其他部分不同的斜杠?


44
微软之所以在这方面落后,是因为MS-DOS 2.0(DOS 1.0没有目录层次结构)使用反斜杠符号来保持与DOS 1.0命令的兼容性,而DOS 1.0使用斜杠符号作为命令行开关。可怕,不是吗? - Nosredna
13
命令行开关中使用斜杠("/")的惯例是从CP/M继承而来的。 - starblue
2
可能是以下问题的重复:文件路径中'/'和''的区别 - Florian Koch
12个回答

103

在这方面,Windows 可以说是操作系统中的棘手儿子,但许多 API 也会接受斜杠作为文件路径分隔符。在 Windows 上,文件路径看起来像这样:

C:\Users\jsmith\Documents\file.txt

在类Unix系统(包括Mac OS X和Linux)上,相同的路径看起来像这样:

/home/jsmith/Documents/file.txt

URL在RFC 1738中标准化,始终使用正斜杠,无论平台如何:

http://home.example.com/Documents/file.txt

这是历史原因。即使是Windows也不能改变我们对URL的思考方式。当你谈论反斜杠时,你只会在Windows(和其他一些新颖的平台)上找到它们被使用。

除了Windows之外,你可能会看到反斜杠用于UNC路径——然而,Windows也是主要的支持者:

\\HOMESVR\Documents\file.txt

无论你做什么,都不要为你的网站制作一个商业广告,并说“我的公司点com斜杠促销”。


3
Internet Explorer可以接受反斜杠代替正斜杠吗? - BryanH
4
BryanH说:虽然不正确,但确实有这样做。请参见:http://blogs.msdn.com/ie/archive/2006/12/06/file-uris-in-windows.aspx - Ben James
1
@Bryan:ie也对(编码的)%40做了一些与rfc规定直接相反的操作——规定/必须是主机与资源之间的分隔符。我最近进行了一些调查,发现在某个层面上,整个M$的事情都是为了让每个人满意,因此msie对"/"和""的处理方式很可能是不可预测的。 - Nicholas Jordan
1
这并不完全正确。Windows接受路径中的“/”和“\”。 - Timmmm
1
Windows cmd shell在这里有一些奇怪的行为 - 输入dir "C:/Windows/System32/"可以看到一个包括cmd.exe在内的文件长列表,然后观察dir "C:/Windows/System32/cmd.exe"无法工作。很奇怪。 - yoyo
显示剩余2条评论

76

文件路径和URI是不同的。在Windows文件路径中使用\是正确的,在URI中使用/是正确的。

因此,这个文件路径:C:\Documents\Foo 转换为这个URI:file:///C:/Documents/Foo


7
值得一提的是,在多种编程语言中,反斜杠 / 是字符串转义字符...在硬编码的字符串中使用反斜杠会需要额外添加一个反斜杠,例如 var foo = "C:\\Documents\\Foo";. - Matthemattics
此外,几个浏览器(尤其是Firefox和Opera)在遇到带有反斜杠的URI时会发生严重错误。 - Matthemattics
17
不正确。file:///C:\Documents\Foo 可以正常运行。 - Borodin
3
当您尝试使用"file:///"访问文件时,Windows是非常宽容的,允许file:///C:\Documents\Foo, file:///C:/Documents/Foo以及混合的示例,例如file:///C:/Documents\Foo。而且您还可以变化字母字符的大小写。 - ProfDFrancis
7
这个答案完全错误。不仅file:///C:\Documents\Foo有效,C:/Documents/Foo也是有效的。 - Timmmm
1
@Timmmm 这两种方法都是不正确的,只能在某些情况下“作为一种礼貌”从某个函数或程序中起作用。 - CherryDT

52
这个原因来自于一小段历史。当创建UNIX,或者说更确切地说为UNICS时,他们选择了/作为目录的分隔符。
早期,存储介质比较小,根目录中的每个目录都是另一个已挂载的存储设备(如/bin /lib等)。
当微软发布MS-DOS 1.0版本时,它并没有目录支持。他们使用/字符来表示程序参数(program /a /b)。
MS-DOS 1.0是一个源自CP/M的操作系统,并袭承了驱动器字母(A:C:等)。
随着后来版本想要添加一些目录支持,他们选择使用\,因为在他们的操作系统中/已经有了另一种含义。
现代操作系统中存在许多计算机历史的遗物,我想大多数人都没有意识到,但它们仍然对操作系统的工作方式产生了重大影响。
那么,哪种方法才是正确的?如果有的话,我会说是/,因为UNIX-like操作系统在微软将目录支持实现到他们的DOS之前就已经存在了。

3
我认为UNIX从MULTICS中借用了/符号。 - Esteban Küber
是的,历史确实可以追溯得更久远。 - André van Schoubroeck
7
没有所谓的“正确方式”,但需要注意的是Windows可以使用两种分隔符。 - PC Luddite

18

顺便提一下,如果涉及到.NET技术,你应该使用System.IO.Path.DirectorySeparatorChar来获取当前路径的分隔符。


当前的文件分隔符是什么?顺便问一下,什么情况下不是斜杠? - Letterman
@Itay:DirectorySeparatorChar,所以path分隔符=) 在*nix上可能会有所改变。 - Rubens Farias
2
现在我们有了.NET Core(并且可能一直在使用Mono),[System.IO.Path] :: DirectorySeparatorChar确实在Unix平台上报告/。然而,属性名称不幸的是,特别是考虑到还有[System.IO.Path] :: PathSeparator,它报告用于在PATH环境变量中分隔条目的(特定于平台的)字符(; vs. :)。还要注意,有[System.IO.Path] :: AltDirectorySeparatorChar,它在Windows上也报告/,以反映您甚至可以在Windows上使用/的事实。 - mklement0

17
就文件系统路径分隔符而言,我认为在Windows上所有API都会接受正斜杠(但也许有一些有缺陷的API不会)——问题在于大多数应用程序不接受它们(或者解析不正确)。
事实上,如果我没记错的话,即使是MS-DOS自从支持子目录(v2.0)以来,也接受'/'作为路径分隔符的API级别——但那时候'/'字符已经被确定为命令行选项的'switch'字符,所以反斜杠成为了DOS(以及后来的Windows)的事实标准路径分隔符。
URI与文件路径类似但又有所不同,URI应该始终使用'/'来分隔组件。Windows应用程序和API可能在URI中接受'\'作为分隔符,可能是因为人们习惯在这些系统上使用反斜杠作为分隔符,而URI也可以用于表示本地文件。
无用的小知识:在某些早期版本的MS-DOS中,有一个API可以更改命令行选项开关字符(通常从'/'改为'-'),这样命令看起来更像Unix,并且命令将接受命令行上的'/'作为路径分隔符。此API不太成功(我猜这是因为不是所有应用程序都支持它),后来被删除了。
嗯...再仔细阅读,这整个答案几乎都是无用的小知识。

11

我可以证实:上面许多留言是错误的...

  • Windows接受/\两种符号。

  • Linux只接受/

这是因为当你在Windows下开发PHP时,你使用/。它可以兼容Windows和Linux...


6

互联网的路径分隔符是基于UNIX的方式,使用斜杠(/)来分隔目录。而Windows则使用反斜杠(\)来分隔目录。

正确的方式取决于其用途。对于指向Windows机器上本地文件的路径,请使用反斜杠。对于指向基于UNIX的机器(包括Mac和Linux)上的Web资源或文件的路径,请使用斜杠。

.NET的URI使用正斜杠的原因是因为它是为在Web浏览器中使用而格式化的。

服务器将执行所有必要的工作,将Web资源链接到硬盘上的文件。


4

Windows支持两种路径格式。

尝试打开Windows资源管理器,输入 C:/Temp/Foo 或者 c:\Temp\Foo,都可以正确打开文件夹。


1
哪个版本的Windows? - jxramos
可能是所有的版本,但至少从Windows XP开始就是这样。 - Timmmm
1
Windows NT及其后续版本。 - ՕլՁՅԿ
@jxramos 所有的Windows NT版本都支持这一点,但是它从OS/2开始就可以互换使用。然而,DOS衍生版本的Windows从未支持过这一点,因此任何允许它们的程序都将是特定于应用程序的。正确使用Windows API编写的良好形式的Windows程序将在所有现代版本的Windows中同时支持两者。 - PC Luddite

3

Windows使用反斜杠(\)作为文件系统分隔符,而其他情况下则使用正斜杠(/)。Uri类型使用正斜杠,因为这是统一资源标识符的定义方式。


2

\反斜杠很危险,因为你需要一直小心转义。许多编程语言都有一个printf相当的功能,使用反斜杠进行转义。

/正斜杠大多无害。

:冒号曾经(在某种程度上仍然是)被苹果使用过。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接