72

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

4

12 回答 12

85

在这方面,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 反斜杠促销”。

于 2009-10-19T17:18:01.317 回答
69

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

所以这个文件路径:C:\Documents\Foo翻译成这个URI:file:///C:/Documents/Foo

于 2009-10-19T17:18:00.397 回答
47

原因是一点点历史。在创建 UNIX 时,或者我应该说 UNICS,他们选择 / 作为目录的分隔符。过去,存储介质相当小,根目录下的每个目录都是另一个挂载的存储设备(/bin /lib 等)

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

MS-DOS 1.0,Q-DOS 的快速更名,是一个 CP/M 派生的操作系统,它继承了驱动器号(A:C:等)

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

现代操作系统中有许多计算机历史的产物,我想大多数人都没有意识到,但它们仍然对它们的工作方式产生重大影响。

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

于 2009-10-19T17:43:39.817 回答
16

作为旁注并谈论.NET,您应该使用System.IO.Path.DirectorySeparatorChar来获取当前路径分隔符。

于 2009-10-19T17:20:57.550 回答
15

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

事实上,如果我没记错的话,自从 MS-DOS 开始支持子目录 (v2.0) 以来,甚至 MS-DOS 都接受了 '/' 作为 API 级别的路径分隔符——但到那时,'/' 字符已经被确定为命令行选项的“开关”字符,因此反斜杠成为 DOS(以及后来的 Windows)上事实上的路径分隔符。

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


当天无用的琐事 - 在一些早期版本的 MS-DOS 中,有一个 API 可以更改命令行选项开关字符(通常从“/”到“-”),因此命令看起来更像 Unix,并且命令会接受 '/' 作为命令行上的路径分隔符。API 不太成功(我猜是因为应用程序没有普遍支持它),并且在以后的版本中被删除了。

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

于 2009-10-19T17:46:23.323 回答
4

Web 基于 UNIX 方式,在路径中使用斜杠 (/) 分隔目录。Windows 使用反斜杠 (\) 分隔目录

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

.NET 的 URI 使用正斜杠的原因是因为它是在网络浏览器中使用的格式。

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

于 2009-10-19T17:18:32.943 回答
4

我可以确认:上面的许多消息都是错误的......

  • Windows 接受两者/\

  • Linux 只接受/

这是因为当你在 Windows 下开发 PHP 时,你使用/. 它适用于 Windows 或 Linux...

于 2019-11-15T21:45:35.403 回答
3

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

于 2009-10-19T17:17:39.727 回答
3

Windows 接受两者作为路径。

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

于 2018-08-21T09:30:56.893 回答
2

\ 反斜杠很危险,因为您需要一直小心转义。许多编程语言都有一个 printf 等效项,它使用反斜杠进行转义。

/ Frontslash 基本上是无害的。

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

于 2009-10-19T17:49:02.710 回答
1

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

于 2021-08-05T12:24:14.847 回答
1

另外要添加到其他答案,如果您需要构建路径,请不要使用反斜杠或正斜杠来形成基于 Windows 或 Linux 的路径。

最好的方法是使用Path.Combine.

是文档。

于 2021-10-15T05:09:49.883 回答