文件路径中正斜杠(/)和反斜杠(\)之间的区别


152

我想知道文件路径\和之间的区别/。我注意到有时路径包含/,有时路径包含\

如果有人可以解释何时使用\和,那就太好了/


4
在什么情况下有区别?网络环境?转义为C#字符串?它用ASP.NET标记。
彼得·莫滕森


6
@Peter我将关闭较老的一个,因为它有更好的答案。
nicael

6
如何在C#asp.net有关的问题吗?
Oriol

2
@zzzzBov为什么不简单地将其重定向到较旧的一个,并在其中放置更好的答案?我不喜欢这样的系统:我所提出的问题可能会在不久的将来作为重复出现的某些事情而关闭。至少称它为更具描述性的内容,例如“已取代”而不是重复。原始的“一个”不能重复任何东西,它是唯一的。

Answers:


247

/是Unix和类Unix系统上的路径分隔符。现代Windows通常可以同时使用\/互换使用文件路径,但是\数十年来,Microsoft一直提倡将其用作路径分隔符。

这样做的历史原因可追溯到1970年代,比Windows早十年。最初,MS-DOS(早期Windows的基础)不支持目录。/从一开始,Unix就具有使用该字符的目录支持。但是,当在MS-DOS 2.0中添加目录时,Microsoft和IBM已经在命令开关中使用了该/字符,并且由于DOS的轻量级解析器(从QDOS降级,旨在在较低端的硬件上运行),他们找不到在不破坏与现有应用程序兼容性的情况下使用字符的可行方法。/

因此,为避免在将文件路径作为以下命令的参数传递时出现有关“缺少开关”或“无效开关”的错误:

cd/                        <---- no switch specified
dir folder1/folder2        <---- /folder2 is not a switch for dir

决定\改用该字符,因此您可以这样编写这些命令

cd\
dir folder1\folder2

没有错误。

后来,Microsoft和IBM合作开发了与DOS不相关的操作系统OS / 2。OS / 2具有使用两个分隔符的能力,可能吸引了更多的Unix开发人员。当Microsoft和IBM在1990年分道扬,时,Microsoft拿走了自己拥有的代码并创建了Windows NT,所有现代版本的Windows都基于Windows NT,并带有分隔符不可知论。


由于向后兼容性一直是Microsoft从其进行的所有主要操作系统过渡(DOS到Win16 / DOS,Win16 / Win32,Win32 / WinNT)的游戏名称,因此这种特殊性仍然存在,并且很可能会存在了一段时间。

出于这个原因,存在这种差异。它实际上对您的操作没有任何影响,因为正如我所说,WinAPI通常可以互换使用。但是,如果您在目录名称之间输入a /时传递a ,则第三方应用程序可能会中断\。如果您使用的是Windows,请坚持使用\。如果您使用的是Unix或URI(它们在Unix路径中有基础,但这完全是另一回事了),请使用/


在C#上下文中:应该指出的是,由于从技术上讲这一个C#问题,如果您想编写更多在Unix和Windows上都可以使用的“便携式” C#代码(即使C#主要是Windows语言),您也可以可能要使用该Path.DirectorySeparatorChar字段,以便您的代码使用该系统上的首选分隔符,并用于Path.Combine()正确地附加路径。


57
并始终使用组合路径Path.Combine
程晨

1
有趣。因此,在DOS或Windows下,例如,foo.exe /bar可能被解释为命令行开关,而foo.exe \bar可能被解释为是指bar位于\当前“驱动器” 根目录中的称为文件/文件夹的文件C:\
杰普·斯蒂格·尼尔森

4
应当指出,从/到的标准化\ 是在Win32兼容层中完成的,这意味着如果您绕过它,将会有所不同。最著名的例子是扩展长度路径:\\?\C:\ 可以在NTFS上按预期工作,但\\?\C:/不能。
Voo

4
@PC Luddite:WinAPI可以同时处理/` is not entirely true. For network path you have to use `(例如\\ <服务器名> bot不能/// <服务器名>)
raznagul

2
@raznagul是的。我在回答中并未真正提及网络路径。我主要坚持使用常见的文件路径类型。我将添加。
PC Luddite

20

MS-DOS 1.0保留了CP / M中'/'的命令行选项(或开关)字符约定。那时,文件系统中没有目录结构,也没有冲突。

当Microsoft使用MS-DOS(和PC-DOS)2.0开发更像Unix的环境时,他们需要使用与现有命令行选项不冲突的东西来表示路径分隔符。在内部,系统使用'/'或'\'都可以很好地工作。命令处理器(和许多应用程序)继续使用'/'作为切换字符。

可以使用一个CONFIG.SYS条目SWITCHAR=-来覆盖/默认值以提高Unix兼容性。这使内置命令和标准实用程序使用备用字符。然后可以明确地将Unix路径分隔符用于文件和目录名称。此项在更高版本中已删除,但是记录了DOS调用,以便在引导后设置该值。

这很少使用,大多数第三方工具保持不变。混乱依然存在。Unix工具的许多端口都保留“-”开关字符,而某些端口则同时支持这两种约定。

后续的PowerShell命令处理器实现了严格的转义和切换参数,并在使用旧版工具的地方大体上避免了混乱。

问题和答案都与C#无关。


2
作为历史记录,/在各种PDP-11操作系统(例如RSTS(1970)和RSX(1972))中,将其用作选件介绍器的做法早于CP / M(1973)。
PJTraill '16

9

在基于Unix的系统上,\是转义字符,即\告诉解析器这是一个空格,而不是语句的结尾。在Unix系统上/是目录分隔符。

在Windows上\是目录分隔符,但是/不能在文件名或目录名中使用。


1
\ /(以及其他几个符号)不能在文件名中使用,因为DOS不像Unix用户那样具有复杂的解析器。缺少好的分析器是由于MS-DOS是QDOS(“快速而肮脏的操作系统”)的后代。它的目的是使事情在有限的硬件上快速运行。当然,为了向后兼容,目前所有这些仍然存在。
PC Luddite

2
好了,值得一提的是,在更高的Windows版本中,它/被添加为“ Alternate_Directory_Separator”
Tomer W 2016年

@PCLuddite也许我们应该考虑向前兼容?

1
@nocomprende文件路径不兼容怎么办?与什么不相容?就像我之前说过的那样,保存“几个DOS应用程序”(实际上更像是数千个)免受破坏对于当时的消费者来说确实很重要。这就是使Microsoft今天取得成功的原因,而Unix(以及其他所有方面)确实开始处于衰落状态(即使最近十年出现了复苏)。我看不出这不是常识。
PC Luddite

1
@nocomprende关于文件路径未标准化的论点完全无效。它们在Windows上标准化,在Unix上标准化。如果您在谈论跨平台标准,那实际上不是那么有用或容易实现。谁说一个标准真的比另一个标准“更好”?
PC Luddite

8
  • 在RFC 1738中标准化的URL始终使用正斜杠,而不管平台如何。
  • 文件路径和URI不同。\在Windows文件路径/中正确,在URI中正确。
  • 遇到带有反斜杠的URI时,多个浏览器(即Firefox和Opera)会严重失败。
  • System.IO.Path.DirectorySeparatorChar获取当前路径分隔符

可能是相关资源。


10
灾难性地失败?Firefox \​​/自动转换为。在我的书中,这被称为“无缝工作”。
Kroltan '16

22
我的房子上次使用\在Firefox中着火了
user3163495

1
@ CarstenS,Firefox不会自动将URL中的反斜杠自动转换为正斜杠,并且不会打开链接。此附加组件使用反斜杠和打开的页面更正URL。addons.mozilla.org/zh-CN/seamonkey/addon/…–
萨米

您所说的“灾难性失败”到底是什么意思?怎么了?浏览器会崩溃并退出吗?
彼得·莫滕森

7

除了给出的答案外,值得一提的\是,它广泛用于\n \t编程语言,文本编辑器和应用词法分析的常规系统中的特殊字符(例如)。

例如,如果您正在编程,有时甚至需要用另一个(\\)转义反斜杠以正确使用它,或者需要使用转义字符串,例如C#,这是不方便的@"\test"

当然,如前所述,Web URI按标准使用正斜杠 但是两个斜杠都可以在最新和最常用的命令行工具中使用

更新:经过一番搜索,似乎可以追溯到DOS和基于Unix的系统时代的整个历史,/并且\可以追溯到“计算机历史”上。HowToGeek上有一篇有趣的文章

简而言之,DOS 1.0最初是由IBM发布的,没有目录支持,并且/已用于另一种(“切换”)命令功能。在2.0版中引入目录时,该目录/已经在使用中,因此IBM选择了外观上最接近的符号\。另一方面,Unix标准用于/目录。

当用户开始使用许多不同的系统时,他们开始感到困惑,这使得OS开发人员试图使系统在两种情况下都可以工作-这甚至适用于URL部分,因为某些浏览器支持http:\\ www.test。 com \ go格式。尽管总体上来说这有缺点,但是今天整个事情仍然可以向后兼容,即使它们不再基于DOS,也试图在Windows上支持两个斜杠。


“两个斜线都在文件系统路径中工作。” 这是不正确的,因为当您使用` as well as many make` shell 时Unix会非常生气……您是正确的,因为最近Windows定义了ALTERNATE_PATH_SEPARATOR环境变量,该变量默认为/Windows ,因此Windows可能接受两者。
Tomer W

1
@TomerW Windows NT一直都是POSIX兼容的(尽管早期的POSIX总是一团糟,并且其中有些卡在Windows中是为了向后兼容)。其中包括支持系统中所有位置的/路径-当然,应用程序可能会在闲暇时误解这些路径,因此并没有太多使用。没有尝试对路径进行自己(破碎)验证的非CLI应用程序从一开始就运行良好。
a安

@Luaan Windows能够支持许多POSIX功能,但是我很难说它是“ POSIX兼容的”。当然,多年来可以使用几个POSIX子系统,但是这些都不是理想的。Windows 10将在今年夏天晚些时候支持Ubuntu bash,同时对Ubuntu随附的Linux工具提供本机支持,因此您将来可能会争论不休,但您肯定不能说“总是”。
PC Luddite

@Luaan除非“兼容”,否则表示“ cygwin作品”。
PC Luddite

@PCLuddite不,它是100%兼容POSIX.1c。这并不意味着所有的unix应用程序都可以使用它-大多数的unix应用程序都不符合POSIX :)
Luaan

6

您不应该在C#中使用任何一个。您应该始终使用Path该类。它包含一个称为的方法Path.Combine,该方法可用于创建路径,而无需自己指定分隔符。

用法示例:

string fullPath = System.IO.Path.Combine("C:", "Folder1", "Folder2", "file.txt");

5

\ 用于Windows本地文件路径和网络路径,如下所示:

C:\Windows\Temp\ 要么 \\NetworkSharedDisk\Documents\Archive\

/ 标准URI所需要的是:

http://www.stackoverflow.com/


2
@NikhilVartak,我添加了一些示例,尽管我认为我最初的回答解决了OP的所有问题。
Ash Ash

3
Windows还可以识别/路径(至少7个)。
肯尼斯·K

这个答案远未完成。
reinierpost

您是否打算链接到某些资源,而不仅仅是Stack Overflow主页?
塔斯州

@reinierpost,我的回答是基于OP的问题和相关标签。像这里的其他答案一样,我可以从stackoverflow.com/questions/1589930/…中复制某些内容并将其粘贴到此处,但这似乎过多。@tas,我打算链接到stackoverflow页面或任何网站超链接,以说明/如我在回答中所述的标准URI的使用。
Ash Ash
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.