文件路径中正斜杠 (/) 和反斜杠 (\) 之间的区别
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
`(例如,\\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 中的使用,正如我在答案中所述。以上是关于文件路径中正斜杠 (/) 和反斜杠 (\) 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章