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

Difference between forward slash (/) and backslash (\) in file path

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

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

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

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

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

http://www.whosebug.com/

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

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

  • A​​ URL,在 RFC 1738 中标准化,始终使用正斜杠, 无论平台如何。
  • 文件路径和URI不同。 \ 在 Windows 文件中是正确的 路径和 / 在 URI 中是正确的。
  • 几个浏览器(即 Firefox 和 Opera)在以下情况下发生灾难性故障 遇到带有反斜杠的 URI。
  • System.IO.Path.DirectorySeparatorChar获取当前路径分隔符

This 可以是相关资源。

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

这是出于历史原因,可以追溯到 1970 年代,比 Windows 早了十多年。一开始,MS-DOS(早期 Windows 的基础)不支持目录。 Unix 从一开始就使用 / 字符支持目录。然而,当在 MS-DOS 2.0 中添加目录时,Microsoft 和 IBM 已经将 / 字符用于 command switches, and because of DOS's lightweight parser (descended from QDOS,设计用于低端硬件上的 运行)他们找不到在不破坏与现有应用程序兼容性的情况下使用 / 字符的可行方法。

因此,为了避免在将文件路径作为参数传递给如下命令时出现有关 "missing a switch" 或 "invalid switch" 的错误:

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 had the ability to use both separators, probably to attract more Unix developers. When Microsoft and IBM parted ways in 1990, Microsoft took what code they had and created Windows NT,Windows 的所有现代版本都基于该操作系统,并带有这种分隔符不可知论.


因为向后兼容性一直是 Microsoft 从他们进行的所有主要 OS 过渡(DOS 到 Win16/DOS,到 Win16/Win32, 到 Win32/WinNT), 这个特性一直存在,它可能会存在一段时间。

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


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

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

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

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

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

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

Neither the question nor the answer relate to C#.

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

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

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

更新:稍微搜索了一下,似乎 /\ 之间的整个故事可以追溯到 "computer history",在 DOS 的时代以及当时基于 Unix 的系统。 HowToGeek 关于这个故事有一个有趣的 article

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

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

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

用法示例:

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