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

Posted

技术标签:

【中文标题】文件路径中正斜杠 (/) 和反斜杠 (\\) 之间的区别【英文标题】:Difference between forward slash (/) and backslash (\) in file path文件路径中正斜杠 (/) 和反斜杠 (\) 之间的区别 【发布时间】:2016-11-20 13:54:29 【问题描述】:

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

如果有人能解释何时使用\/,那就太好了。

【问题讨论】:

在什么情况下有区别?韦比环境?在 C# 字符串中转义?它被标记为 ASP.NET。 Difference between forward and backslash 的可能重复项 @Peter 我会因为这个被骗而关闭旧的,因为这有更好的答案。 c# 和 asp.net 与问题有何关联? @zzzzBov 为什么这个不简单地重定向到旧的,更好的答案放在那里?我不喜欢这样一个系统,在这个系统中,我提出的问题可能会在遥远的将来作为后来发生的事情的“重复”而被关闭。 至少称它为更具描述性的东西,例如“取代”而不是重复。原来的“一个”不能与任何东西重复,它是唯一的。 【参考方案1】:

/ 是 Unix 和类 Unix 系统上的路径分隔符。现代 Windows 通常可以同时使用 \/ 作为文件路径,但微软几十年来一直提倡使用 \ 作为路径分隔符。

这样做的历史原因可以追溯到 1970 年代,比 Windows 早了十多年。一开始,MS-DOS(早期 Windows 的基础)不支持目录。 Unix 从一开始就使用/ 字符支持目录。然而,当在 MS-DOS 2.0 中添加目录时,Microsoft 和 IBM 已经在使用 / 字符来表示 command switches,并且由于 DOS 的轻量级解析器(源自 QDOS,旨在在低端硬件上运行),他们找不到可行的方法来使用/ 字符而不破坏与现有应用程序的兼容性。

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

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

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

cd\
dir folder1\folder2

没有错误。

后来,微软和 IBM 合作开发了一个与 DOS 无关的操作系统,名为OS/2。 OS/2 能够同时使用这两种分隔符,这可能会吸引更多的 Unix 开发人员。当Microsoft and IBM parted ways in 1990 时,Microsoft 采用了他们拥有的代码并创建了 Windows NT,所有现代版本的 Windows 都基于它,并带有这种分隔符不可知论。


由于向后兼容性一直是微软从他们进行的所有主要操作系统转换(从 DOS 到 Win16/DOS、到 Win16/Win32、到 Win32/WinNT)的游戏名称,因此这种特性一直存在,并且它可能会存在一段时间。

正是由于这个原因,存在这种差异。它应该对你正在做的事情没有任何影响,因为就像我说的那样,WinAPI 通常可以互换使用它们。但是,如果您在第 3 方应用程序期望目录名称之间有 \ 时传递 /,则它们可能会中断。如果您使用的是 Windows,请坚持使用 \。如果您使用的是 Unix 或 URIs(它们的基础是 Unix 路径,但这完全是另一回事),那么请使用 /


在 C# 的上下文中: 应该注意,由于这个 在技术上是一个 C# 问题,如果你想编写更“可移植”的 C# 代码在 Unix 和 Windows 上(即使 C# 主要是一种 Windows 语言),您可能希望使用 Path.DirectorySeparatorChar 字段,以便您的代码使用该系统上的首选分隔符,并使用 Path.Combine() 正确附加路径。

【讨论】:

并始终使用Path.Combine 组合路径。 有趣。所以在 DOS 或 Windows 下,foo.exe /bar 可能被解释为命令行开关,而foo.exe \bar 可能被解释为引用位于当前根目录\ 的名为bar 的文件/文件夹。 “驱动器”,例如 C:\ 需要注意的是,这个从/\ 的规范化是在Win32兼容层完成的,也就是说如果你绕开它,就会有区别。最著名的例子是扩展长度路径:\\?\C:\ 将在 NTFS 上按预期工作,但 \\?\C:/ 不会。 @PC Luddite:WinAPI 可以同时处理/` is not entirely true. For network path you have to use `(例如,\\ bot 不是 // @raznagul 是的。我的回答中并没有真正提到网络路径。我主要坚持使用常见的文件路径类型。我会补充的。【参考方案2】:

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

当微软使用 MS-DOS(和 PC-DOS)2.0 开发更类似于 Unix 的环境时,他们需要使用不与现有命令行选项冲突的东西来表示路径分隔符。在内部,系统与“/”或“\”同样适用。命令处理器(和许多应用程序)继续使用“/”作为切换字符。

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

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

后续的 PowerShell 命令处理器实现了严格的转义和切换参数,并在很大程度上避免了混淆,除非使用旧工具。

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

【讨论】:

作为历史记录,在各种 PDP-11 操作系统(例如 RSTS (1970) 和 RSX (1972) 中使用 / 作为选项介绍器的做法先于 CP/M (1973) .【参考方案3】:

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

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

【讨论】:

\ /(以及其他几个符号)不能用于文件名,因为 DOS 没有 Unix 用户习惯的复杂解析器。缺少好的解析器是 MS-DOS 源自 QDOS(“快速而肮脏的操作系统”)的结果。它旨在让事情在有限的硬件上快速运行。为了向后兼容,所有这些当然仍然存在。 好吧,值得一提的是,在后来的 Windows 版本中,/ 被添加为“Alternate_Directory_Separator” @PCLuddite 也许我们应该考虑向前兼容? @nocomprende 文件路径不兼容怎么办?与什么不相容?就像我之前说的那样,在当时,让“一些 DOS 应用程序”(实际上更像是数千个)免于崩溃对于当时的消费者来说非常重要。这就是微软今天成功的原因,而 Unix(以及所有其他人)开始走下坡路(即使在过去十年中出现了复苏)。我看不出这不符合常识 @nocomprende 您关于文件路径未标准化的论点是完全无效的。它们在 Windows 上是标准化的,在 Unix 上是标准化的。如果您谈论的是跨平台标准,那并不是那么有用或易于实现。谁说一个标准真的比另一个“更好”?【参考方案4】: 在 RFC 1738 中标准化的 URL 始终使用正斜杠, 与平台无关。 文件路径和URI 不同。 \ 在 Windows 文件中是正确的 path 和 / 在 URI 中是正确的。 几个浏览器(即 Firefox 和 Opera)在以下情况下发生灾难性故障 遇到带有反斜杠的 URI。 System.IO.Path.DirectorySeparatorChar 获取当前路径分隔符

This 可以是相关资源。

【讨论】:

惨败? Firefox 自动将\​​ 转换为/。在我的书中,这被称为“无缝工作”。 我上次在 Firefox 中使用 \ 时我的房子着火了 @CarstenS,Firefox 不会自动将 URL 中的反斜杠转换为正斜杠,也不会打开链接。此附加组件使用反斜杠和打开页面更正 URL。 addons.mozilla.org/en-US/seamonkey/addon/… “灾难性失败”到底是什么意思?发生什么了?浏览器会崩溃退出吗?【参考方案5】:

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

示例用法:

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

【讨论】:

【参考方案6】:

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

例如,如果您正在编程,有时甚至需要用另一个反斜杠 (\\) 转义反斜杠才能正确使用它 - 或者需要使用转义字符串,例如 C# @987654326 @。

当然,如前所述,Web URI 按标准使用正斜杠但两个斜杠都适用于最新和最常见的命令行工具

更新:经过一番搜索,/\ 之间的整个故事似乎可以追溯到“计算机历史”,在当时 DOS 和基于 Unix 的系统时代。 HowToGeek 有一个有趣的article 关于这个故事。

简而言之,DOS 1.0 最初由 IBM 发布,不支持目录,/ 用于另一个(“切换”)命令功能。在 2.0 版本中引入目录时,/ 已经在使用中,因此 IBM 选择了视觉上最接近的符号,即 \。另一方面,Unix 标准地使用/ 作为目录。

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

【讨论】:

"两个斜线都在文件系统路径中工作。"是不正确的,因为当你使用` as well as many make` shell 时,Unix 会很生气......你是对的,最近的 Windows 已经定义了默认为 / 的 ALTERNATE_PATH_SEPARATOR 环境变量,因此 Windows 可能可以同时接受这两者。 @TomerW Windows NT 一直是 POSIX 兼容的(尽管早期的 POSIX 还是一团糟,其中一些卡在 Windows 中是为了向后兼容)。这包括支持系统中各处的/ 路径——当然,应用程序可能会在闲暇时误解这些路径,所以它并没有被过多地使用。不尝试自己(损坏)路径验证的非 CLI 应用程序从一开始就运行良好。 @Luaan Windows 能够支持许多 POSIX 功能,但我很难说它是“POSIX 兼容的”。当然,多年来可以使用一些 POSIX 子系统,但它们远非理想。 Windows 10 将在今年夏天晚些时候支持 Ubuntu bash,同时原生支持 Ubuntu 附带的 Linux 工具,所以你可能会在未来争论这一点,但你当然不能说“总是”。 @Luaan 除非“兼容”你的意思是“cygwin 工作”。 @PCLuddite 不,它 100% 兼容 POSIX.1c。这并不意味着所有的 unix 应用程序都可以使用它 - 大多数 unix 应用程序 POSIX 兼容:)【参考方案7】:

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

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

/ 是标准 URI 所要求的,如下所示:

http://www.***.com/

【讨论】:

@NikhilVartak,尽管我认为我最初的回答解决了 OP 的所有问题,但我已经添加了示例。 Windows 还可以识别路径中的/(至少有 7 个)。 这个答案还远远不够。 除了 Stack Overflow 主页之外,您是否打算链接到一些资源? @reinierpost,我的回答是基于 OP 的问题和相关标签。像这里的其他几个答案一样,我可以从***.com/questions/1589930/… 复制一些内容并将其粘贴到这里,但这似乎太过分了。 @tas,我打算链接到 *** 页面或任何网站超链接,以说明 / 在标准 URI 中的使用,正如我在答案中所述。

以上是关于文件路径中正斜杠 (/) 和反斜杠 (\) 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

路径中 斜杠/和反斜杠 的区别

路径中关于斜杠/和反斜杠 的区别

斜杠/和反斜杠 的区别

斜杠/和反斜杠的区别

路径中 斜杠/和反斜杠 的区别

Mercurial:我可以在路径中混合斜杠和反斜杠吗?