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

Spi*_*man 145 c# path slash filepath backslash

我想知道文件路径\/文件路径之间的区别.我注意到有时路径包含/,有时它与之相关\.

如果有人能解释何时使用\和,那将是很好的/.

PC *_*ite 238

/是Unix和类Unix系统上的路径分隔符.现代Windows通常可以同时使用\/交换文件路径,但微软\几十年来一直主张使用路径分隔符.

这是出于历史原因,可以追溯到20世纪70年代,超过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
Run Code Online (Sandbox Code Playgroud)

决定使用该\字符,所以你可以像这样编写这些命令

cd\
dir folder1\folder2
Run Code Online (Sandbox Code Playgroud)

没有错误.

后来,微软和IBM合作开发了一个与DOS无关的操作系统OS/2.OS/2有能力使用两个分隔符,可能会吸引更多的Unix开发人员.当微软和IBM在1990年分道扬,时,微软采用了他们所拥有的代码并创建了Windows NT,所有现代版本的Windows都基于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()正确追加路径.

  • 并始终使用[`Path.Combine`](https://msdn.microsoft.com/en-us/library/system.io.path.combine(v = vs.110).aspx)组合路径. (57认同)
  • 应该注意的是,从`/`到`\`的这种规范化是在Win32 compat层中完成的,这意味着如果你绕过它,就会有区别.最着名的例子是扩展长度路径:`\\?\ C:\`将在NTFS上按预期工作,但`\\?\ C:/`不会. (4认同)
  • @PC Luddite:WinAPI可以处理`/`和`\`并不完全正确.对于网络路径,您必须使用`\`(例如.\\ <servername> bot not // <servername>) (4认同)
  • @raznagul真的.在我的回答中我没有真正提到网络路径.我主要使用常见的文件路径类型.我会补充一点. (2认同)

Pek*_*kka 20

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

当Microsoft使用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). (2认同)

小智 9

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

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

  • 好吧,值得一提的是,在后来的 Windows 版本中,`/` 被添加为“Alternate_Directory_Separator” (3认同)

Sam*_*ami 8

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

可以是相关资源.

  • 我上次在Firefox中使用\时,我的房子着火了 (21认同)
  • 灾难性的失败?Firefox会自动将`\`转换为`/`.在我的书中,这被称为"无缝地工作". (10认同)
  • @CarstenS,Firefox 不会自动将 URL 中的反斜杠转换为正斜杠,也不会打开链接。此附加组件更正带有反斜杠的 URL 并打开页面。https://addons.mozilla.org/en-US/seamonkey/addon/backslash-to-forward-slash/?src=cb-dl-name (2认同)

Nic*_*kis 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格式.虽然一般来说这有一些缺点,但是现在整个事情仍然存在于向后分隔的原因,试图支持Windows上的两个斜杠,即使它们不再基于DOS.


The*_*der 6

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

用法示例:

string fullPath = System.IO.Path.Combine("C:", "Folder1", "Folder2", "file.txt");
Run Code Online (Sandbox Code Playgroud)


Ash*_*Ash 5

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

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

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

http://www.stackoverflow.com/

  • Windows还识别路径中的`/`(至少7个). (3认同)
  • @NikhilVartak,我添加了一些例子,虽然我认为我的初步答案解决了所有OP的问题. (2认同)