驱动器号和冒号后没有斜杠的 Windows 路径 - 它指向啥?

Posted

技术标签:

【中文标题】驱动器号和冒号后没有斜杠的 Windows 路径 - 它指向啥?【英文标题】:Windows path with no slash after drive letter and colon - what does it point to?驱动器号和冒号后没有斜杠的 Windows 路径 - 它指向什么? 【发布时间】:2014-07-20 07:04:05 【问题描述】:

我输入了错误的路径,而不是c:\foo.txt 写了c:foo.txt。我预计它要么失败要么解析为c:\foo.txt,但它似乎被解析为当前用户主文件夹中的foo.txt

Powershell 返回:

PS C:\> [System.IO.Path]::GetFullPath("c:\foo.txt")
c:\foo.txt
PS C:\> [System.IO.Path]::GetFullPath("c:foo.txt")
C:\Users\Administrator\foo.txt
PS C:\> [System.IO.Path]::GetFullPath("g:foo.txt")
G:\foo.txt

从命令行运行 explorer.exe 并将上述任何内容传递给它会导致 C:\Users\Administrator\Documents 被打开。

我还没有找到任何文档,我完全糊涂了,请解释一下这种行为。

【问题讨论】:

你说得对,找到这方面的文档并非易事。我还在寻找自己。这个问题在superuser.com上会更好 @TimPietzcker - 有关文档,请参阅下面的答案。 【参考方案1】:

当您指定带有驱动器号但没有初始反斜杠的路径时,它通常被解释为指定驱动器上当前目录的相对路径。特别是,普通的 Win32 API 文件函数会这样解释它;因此,大多数将未修改的文件路径传递给 Win32 文件函数的软件也会以这种方式运行。

在我的机器上,这在 PowerShell 中按预期工作,除了一个并发症:

C:\Users\social>powershell
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.

PS C:\Users\social> [System.IO.Path]::GetFullPath("c:foo.txt")
C:\Users\social\foo.txt
PS C:\Users\social> cd \
PS C:\> [System.IO.Path]::GetFullPath("c:foo.txt")
C:\Users\social\foo.txt
PS C:\>

我们在这里看到的是,当我们在 PowerShell 中更改当前目录时,它实际上并没有更改当前目录。也就是说,PowerShell 对当前目录是什么有自己的想法,但并没有费心将更改告诉 Windows。您可以使用 Process Explorer 确认这一点(可以从 Microsoft 的网站下载);在上述情况下,即使使用cd,PowerShell 进程的实际当前目录仍然是C:\Users\social

您还提到了资源管理器。据我所知,Explorer 会对给出的路径进行自己的验证,无论出于何种原因,它都不允许与驱动器相关的路径。如果路径无效,或不指向实际文件/文件夹,则默认操作是打开用户的 Documents 文件夹。

【讨论】:

很高兴知道 PS 不会更改当前目录 - 永远不知道它什么时候派上用场 :) 您(和其他答案)描述的内容是有道理的。但是有文档吗? msdn.microsoft.com/en-us/library/windows/desktop/…【参考方案2】:

这是标准的 DOS/Windows 行为并且一直都是这样。打开命令行看看:

C:\Users\Tim>d:              # change current drive to d:
D:\>c:                       # change back to c: - back in the same directory
C:\Users\Tim>cd d:\users     # change current directory ON D:
C:\Users\Tim>cd \            # still same directory - backslash leads to top dir
C:\>d:                       # change current drive to d:
D:\Users>                    # notice that we're now in the directory D:\Users

驱动器号总是引用该驱动器的当前目录; (前导)反斜杠将您带到顶层目录。

【讨论】:

这是有道理的,并且按照您对命令行的描述工作。但是为什么我的第二个 powershell 示例(使用 c:foo.txt)没有返回 c:\foo.txt?探险家也不跟随。这样做: c: |光盘\ | mkdir \1\2 | cd 1. 然后调用“explorer”。打开 c:\1(很好),但“explorer c:”打开“c:\”。 “explorer c:2”打开... C:\Users\Administrator\Documents @ya23: c:foo.txt 指的是驱动器c: 上当前文件夹中的foo.txt - 这与上面的解释一致,不是吗? 是的,所以它应该打印c:\foo.txt,因为当前文件夹设置为c:\ (由 pwd 和 Get-Location 报告)。 您的问题说它已解析为当前工作文件夹中的foo.txt。所以 GetLocation 说它不是你当前的工作文件夹? 哦,我怎么知道我把你弄糊涂了。不,这不是我当前的文件夹。将编辑问题。【参考方案3】:

它使用该驱动器上的当前工作目录。每个进程“记住”每个驱动器的当前工作目录:

 C:\> cd somepath\subdir
 C:\somepath\subdir>  d:
 D:\> dir c:subsubdir       <--  refers to C:\somepath\subdir\subsubdir

【讨论】:

请参阅我对 Tim Pietzcker 回答的评论。【参考方案4】:

这是文档/说明,由 Harry Johnston 的comment 提供。

MSDN --> Windows 桌面应用程序 --> 开发 --> 桌面技术 --> 数据访问和存储 --> 本地文件系统 --> 文件管理 --> 关于文件管理 --> 创建,删除和维护文件 --> 命名文件、路径和命名空间 --> Fully Qualified vs. Relative Paths

对于操作文件的 Windows API 函数,文件名通常可以 相对于当前目录,而某些 API 需要完全 合格的路径。一个文件名是相对于当前目录的,如果它 不以下列之一开头:

任何格式的 UNC 名称,始终以两个反斜杠字符 ("\") 开头。有关详细信息,请参阅下一部分。 带有反斜杠的磁盘指示符,例如“C:\”或“d:\”。 单个反斜杠,例如“\directory”或“\file.txt”。这也称为绝对路径。

如果文件名仅以磁盘指示符开头而不是 冒号后面的反斜杠,它被解释为一个相对路径 具有指定字母的驱动器上的当前目录。注意 当前目录可能是也可能不是根目录,具体取决于 在最近的“更改目录”期间设置的内容 该磁盘上的操作。这种格式的例子如下:

“C:tmp.txt”是指C盘当前目录下名为“tmp.txt”的文件。 “C:tempdir\tmp.txt”指的是驱动器 C 上当前目录的子目录中的文件。

[...]

【讨论】:

感谢您提供详细解释此帖子查询的文档的链接。 +1

以上是关于驱动器号和冒号后没有斜杠的 Windows 路径 - 它指向啥?的主要内容,如果未能解决你的问题,请参考以下文章

挂载磁盘分区大小

win10系统磁盘管理里面的隐藏分区?

路径中 斜杠/和反斜杠 的区别

Environment.SystemDirectory获得的路径没有反斜杠

路径中关于斜杠/和反斜杠 的区别

斜杠/和反斜杠 的区别