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

我想知道 \/在文件路径上的区别。我已经注意到,有时一个路径包含 /,有时它是与 \

如果有人能够解释什么时候使用 \/,那就太好了。

100985 次浏览

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

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

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

Http://www.stackoverflow.com/

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

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

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

这个 可以是相关的资源。

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

这样做的历史原因可以追溯到20世纪70年代,比 Windows 早了10多年。起初,MS-DOS (早期 Windows 的基础)不支持目录。Unix 从一开始就支持使用 /字符的目录。然而,当目录添加到 MS-DOS 2.0,微软和 IBM 已经使用 /字符的 指令开关,并因为 DOS 的轻量级解析器(从 QDOS,设计运行在低端硬件) ,他们无法找到一个可行的方法来使用 /字符不打破与他们现有的应用程序的兼容性。

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

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

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

cd\
dir folder1\folder2

没有错误。

后来,微软和 IBM 合作开发了一个与 DOS 无关的操作系统 操作系统/2。OS/2能够同时使用两个分隔符,这可能是为了吸引更多的 Unix 开发人员。当 微软和 IBM 在1990年分道扬镳的时候,微软采用了他们已有的代码并创建了 视窗 NT,所有现代版本的 Windows 都基于 视窗 NT,带着这种分隔不可知论。


正如向下兼容从微软的所有主要操作系统的过渡(DOS 到 Win16/dOS,到 Win16/Win32,到 Win32/WinNT) ,这种特殊性一直存在,它可能还会存在一段时间。

正是由于这个原因,这种差异才存在。它应该真的不会影响您正在做的事情,因为正如我所说的,WinAPI 通常可以互换地使用它们。但是,当第三方应用程序希望在目录名之间传递 \时,如果传递的是 /,则第三方应用程序可能会中断。如果你使用 Windows,坚持使用 \。如果您正在使用 Unix 或 URI(它们的基础是 Unix 路径,但那完全是另一回事) ,那么使用 /


在 C # 上下文中: 值得注意的是,因为这个 在技术上是一个 C # 问题,如果你想编写更多在 Unix 和 Windows 上都可以工作的“可移植”C # 代码(即使 C # 主要是一种 Windows 语言) ,你可能需要使用 Path.DirectorySeparatorChar字段,这样你的代码就可以在系统上使用首选的分隔符,并使用 Path.Combine()正确地附加路径。

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

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

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

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

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

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

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

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

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

更新: 在搜索了一下之后,似乎整个 /\之间的故事可以追溯到“计算机历史”,在 DOS 和基于 Unix 系统的时代。关于这个故事,How ToGeek有一个有趣的 文章

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

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

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

示例用法:

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