文件path中正斜杠(/)和反斜杠(\)之间的区别
我想知道文件path中的\
和/
之间的区别。 我注意到有时一个path包含/
有时候是与\
。
如果有人能解释何时使用\
和/
那将是非常好的。
/
是Unix和类Unix系统上的path分隔符。 现代Windows通常可以同时使用文件path和\
/
,但微软已经提倡使用\
作为path分隔符数十年。
这是出于历史原因,早在20世纪70年代,超过十年之前的Windows。 一开始,MS-DOS(早期Windows的基础)不支持目录。 Unix从一开始就有了使用/
字符的目录支持。 但是,当在MS-DOS 2.0中添加目录时,Microsoft和IBM已经使用/
字符作为命令开关 ,并且由于DOS的轻量级parsing器(后来从QDOS ,devise为运行在低端硬件上),他们找不到一个可行的方式来使用/
字符而不破坏与他们现有的应用程序的兼容性。
因此,为了避免在将filepaths作为parameter passing给如下命令时出现“丢失开关”或“无效开关”的错误:
cd/ <---- no switch specified dir folder1/folder2 <---- /folder2 is not a switch for dir
决定用\
字符来代替,所以你可以这样写这些命令
cd\ dir folder1\folder2
没有错误。
后来,微软和IBM在一个与OS / 2无关的操作系统上进行了合作。 OS / 2有能力使用两个分隔符,可能吸引更多的Unix开发者。 当微软和IBM在1990年分道扬</s>时 ,微软采取了他们所拥有的代码,并创build了Windows NT , Windows的所有现代版本都是基于Windows NT的 。
由于向后兼容性是Microsoft从所有主要操作系统转换(DOS到Win16 / DOS,到Win16 / Win32,到Win32 / WinNT)的游戏名称,所以这个特性可能会停滞不前存在一段时间了。
正因为如此,这种差异才存在。 它应该对你所做的没有任何影响,正如我所说的,WinAPI通常可以互换使用它们。 但是,如果您在目录名称之间指定了\
,则第三方应用程序可能会中断。 如果您使用的是Windows,请使用\
。 如果你使用的是Unix或者URIs (它们有Unixpath的基础,但是完全是另一回事),那么使用/
。
在C#的上下文中:应该注意,因为这在技术上是一个C#的问题,如果你想编写更多的“便携”的C#代码在Unix和Windows上工作(即使C#主要是Windows语言),你可能需要使用Path.DirectorySeparatorChar
字段,以便您的代码使用该系统上的首选分隔符,并使用Path.Combine()
正确地附加path。
MS-DOS 1.0保留从CP / M的命令行选项(或开关)字符约定的'/'。 那时文件系统中没有目录结构,也没有冲突。
当Microsoft使用MS-DOS(和PC-DOS)2.0开发更多类Unix环境时,他们需要使用与现有命令行选项不冲突的内容来表示path分隔符。 在内部,该系统与“/”或“\”同样适用。 命令处理器(和许多应用程序)继续使用“/”作为开关字符。
CONFIG.SYS
条目SWITCHAR=-
可以用来覆盖/
default来提高Unix兼容性。 这使内置命令和标准实用程序使用替代字符。 Unixpath分隔符可以明确地用于文件和目录名称。 此条目在更高版本中被删除,但是有一个DOS调用被logging在启动后设置的值。
这很less使用,大多数第三方工具保持不变。 混乱依然存在。 Unix工具的许多端口保留了“ – ”开关字符,而有些则支持这两种约定。
后续的PowerShell命令处理器实现了严格的转义和转换参数,并且在很大程度上避免了使用传统工具的混淆。
问题和答案都不涉及到C#。
- 在RFC 1738中标准化的URL总是使用正斜杠,而不pipe平台。
- 文件path和URI是不同的。
\
在Windows文件path中是正确的,并且/
在URI中是正确的。 - 当遇到反斜线的URI时,几个浏览器(即Firefox和Opera)发生灾难性的失败。
- System.IO.Path.DirectorySeparatorChar获取当前path分隔符
这可以是相关的资源。
在基于Unix的系统上\
是一个转义字符,即\
告诉parsing器这是一个空格而不是语句的结尾。 在Unix系统上, /
是目录分隔符。
在Windows \
是目录分隔符,但/
不能用于文件或目录名称。
除了给出的答案外,值得一提的是\
被广泛用于编程语言,文本编辑器和应用词法分析的一般系统中的特殊字符(如\n
\t
)。
如果你是编程实例,有时甚至需要为了正确使用它而需要使用另一个反斜杠( \\
)来反斜杠,或者需要使用转义string,例如C# @"\test"
。
当然,如前所述,web URI使用标准的正斜杠 但是这两个斜杠在最新和最常用的命令行工具中都能正常工作 。
更新:在search一下之后,似乎在/
和\
之间的整个故事可以追溯到当时的DOS和基于Unix的系统的时代的“计算机历史”中。 HowToGeek有关这个故事的一篇有趣的文章 。
简而言之,DOS 1.0最初是由IBM发布的,没有目录支持,而/
被用于另一种(“切换”)命令function。 在2.0版本中引入目录时, /
已经被使用,所以IBMselect了视觉上最接近的符号,即\
。 另一方面,Unix标准地使用/
用于目录。
当用户开始使用许多不同的系统时,他们开始变得困惑,使操作系统开发人员尝试使系统在这两种情况下工作 – 这甚至适用于URL的一部分,因为一些浏览器支持http:\\ http://www.test。; com \ go格式。 这虽然有一些缺点,但总的来说,今天的整个事情仍然是为了向后分区的原因,即使它们不是基于DOS的,也试图支持Windows上的两个斜线。
你不应该在C#中使用。 您应该始终使用Path
类 。 这包含一个名为Path.Combine
的方法,可以用来创buildpath而不需要自己指定分隔符。
用法示例:
string fullPath = System.IO.Path.Combine("C:", "Folder1", "Folder2", "file.txt");
\
用于Windows本地文件path和networkingpath,如下所示:
C:\Windows\Temp\
或\\NetworkSharedDisk\Documents\Archive\
/
是标准URI所要求的,如下所示: