那么 Windows 下路径斜杠(/或)的正确方向是什么呢?

似乎 Windows 坚持在文件路径中写反斜杠 \,而。NET 的 URI 类使用斜杠 /写入它们。有没有什么正确的方法,即使在最原始的系统中也能被接受?为什么。NET 的 URI 显示其他斜杠相比,Windows 的其余部分?

141536 次浏览

Windows 使用反斜杠(\)作为文件系统分隔符。对于其他所有内容,使用正斜杠(/)。Uri类型使用正斜杠,因为这是定义 统一资源标志符的方式。

文件路径和 URI 是不同的。在 Windows 文件路径中 \是正确的,在 URI 中 /是正确的。

因此这个文件路径: C:\Documents\Foo转换为这个 URI: file:///C:/Documents/Foo

在这方面,Windows 是操作系统的私生子,但是很多 API 也会接受正斜杠。在 Windows 上,文件路径如下:

C:\Users\jsmith\Documents\file.txt

在类 Unix 系统(包括 Mac OS X 和 Linux)上,相同的路径如下:

/home/jsmith/Documents/file.txt

一个在 RFC 1738中标准化的 URL,一直都是使用正斜杠,不管平台是什么:

http://home.example.com/Documents/file.txt

其原因是历史性的。即使是 Windows 也无法改变我们对 URL 的看法。当你谈论反斜杠时,你会发现唯一使用它们的平台是 Windows (和其他一些新奇的平台)。

除了 Windows 之外,你可能看到其他使用反斜杠的地方是 UNC 路径——然而,Windows 也是这些路径的主要支持者:

\\HOMESVR\Documents\file.txt

不管你做什么,不要为你的网站做广告,说“我的公司.com 回斜杠促销”。

Web 是基于 UNIX 的方式,用斜杠(/)来分隔路径中的目录。Windows 用反斜杠()分隔目录

正确的方法取决于它的使用。对于 Windows 计算机上本地文件的路径,请使用反斜杠。对于位于基于 UNIX 的机器(包括 Mac、 Linux)上的 Web 资源或文件的路径,使用斜杠。

NET 的 URI 之所以使用正斜杠,是因为它的格式是为了在 Web 浏览器中使用。

服务器将完成所有必要的工作,将网络资源链接到硬盘上的文件。

作为一个边注和谈论.NET,您应该使用 System.IO.Path.DirectorySeparatorChar来获得当前的路径分隔符。

原因是一段小小的历史。在创建 UNIX 时,或者更确切地说是 UNCS,他们为目录选择了/作为分隔符。 在过去,存储介质非常小,根目录中的每个目录都是另一个挂载的存储设备(/bin/lib 等)

当微软发布 MS-DOS 版本1.0时,它没有目录支持。他们使用/字符表示程序(program/a/b)中的参数

MS-DOS 1.0是 Q-DOS 的一个快速重新命名,是一个 CP/M 派生的操作系统,它从中继承了驱动器字母(A: C: 等等)

在后来的版本中,他们希望添加一些目录支持,所以选择使用/,因为/在他们的操作系统中已经有了另一个含义。

在现代操作系统中有许多计算机历史的产物,我想大多数人都没有意识到这一点,但是这些产物仍然对计算机的工作方式有着重要的影响。

那么,正确的方法是什么?如果有的话,我会说是/因为类 UNIX 操作系统早在微软在 DOS 中实现目录支持之前就已经存在了。

至于文件系统路径分隔符,我相信在 Windows 所有 API 上可以接受正斜杠(但也许有一些错误的不接受)——问题是大多数应用程序不接受它们(或者不正确地解析它们)。

事实上,如果我没记错的话,自从开始支持子目录(v2.0)以来,即使是 MS-DOS 也接受’/’作为 API 级别的路径分隔符——但那时‘/’字符已经被建立为命令行选项的‘开关’字符,因此反斜杠成为 DOS (以及后来的 Windows)上事实上的路径分隔符。

URI 与文件路径类似但又不同,URI 应该始终使用“/”来分隔组件。Windows 应用程序和 API 可能接受“”作为 URI 中的分隔符,可能是因为人们熟悉在这些系统上使用反斜杠作为分隔符,URI 也可以用来表示本地文件。


毫无意义的琐事——在一些早期版本的 MS-DOS 中,有一个改变命令行选项开关字符的 API (通常从“/”改为“-”) ,这样命令看起来更像 Unix,命令将接受“/”作为命令行上的路径分隔符。这个 API 不太成功(我猜是因为应用程序不普遍支持它) ,在后来的版本中它被删除了。

嗯... 在二读时,这整个答案几乎是无用的琐事。

反斜杠是危险的,因为您需要一直小心地进行转义。许多编程语言都有一个 printf 等价物,它使用反斜杠进行转义。

前锋基本上是无害的。

: 冒号是(在某种程度上仍然是)苹果公司使用。

Windows 接受两者作为路径。

尝试打开文件资源管理器并键入 C:/Temp/Fooc:\Temp\Foo将被正确打开。

我可以确认: 上面的许多信息都是假的..。

  • Windows 同时接受 /\

  • Linux 只接受 /

这是因为当你在 Windows 下开发 PHP 时,你使用的是 /

反斜杠 \是实际的 Windows 路径组件分隔符。但是,Windows 在通过其 API 接收到的大多数路径上执行许多路径规范化步骤。这些步骤中的许多都是为了与 MS-DOS 特性兼容(例如,删除尾随点和空格) ,在其中一个步骤中,它将遇到的任何正斜杠 /转换为反斜杠 \。因此,使用斜杠作为路径分隔符通常也可以,当您编写应该在 Windows 和 POSIX (Unix/Linux/macOS/etc)系统上运行的代码时,这非常有用(推荐使用)。有关路径规范化算法的更详细的摘要,请参见文档中的 Windows 系统上的文件路径格式部分。

另外,为了补充其他答案,如果你需要构建路径,请不要使用反斜杠或正斜杠来构建基于 Windows 或 Linux 的路径。

最好的方法是使用 Path.Combine

这里 是文档。