没有斜杠的Windows路径,紧跟着驱动器字母和冒号 - 它指向什么?

10

我输错了路径,本来应该是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。

我没有找到相关的文件说明,感到非常困惑,请解释这种行为。


你说得对,这个问题的文档确实不好找。我自己还在搜索中。这个问题在http://superuser.com上会更好地得到解答。 - Tim Pietzcker
@TimPietzcker - 请查看我的回答下面的文档。 - weir
4个回答

8
当您指定一个带有驱动器号但没有初始反斜杠的路径时,它通常被解释为相对于指定驱动器上的当前目录的路径。特别是,这是普通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)。据我所知,Explorer会对其给定的路径进行验证,出于某种原因不允许驱动器相关路径。如果路径被认为无效,或者没有指向实际的文件/文件夹,则默认操作是打开用户的“文档”文件夹。

很好知道PS不会更改当前目录 - 永远不知道何时会派上用场 :) 你(以及其他答案)所描述的是有道理的。但是有没有文档支持呢? - ya23
2
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx - Harry Johnston

8
这是标准的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:| cd \ | mkdir \ 1 \ 2 | cd 1。然后调用“explorer。”打开c:\ 1(好),但“explorer c:”打开“c:\”。 “explorer c:2”打开... C:\ Users \ Administrator \ Documents。 - ya23
1
@ya23:c:foo.txt 指的是 c: 驱动器上当前文件夹中的 foo.txt 文件 - 这与上面的解释一致,不是吗? - Tim Pietzcker
是的,所以它应该打印 c:\foo.txt,因为当前文件夹设置为 c:\(由 pwd 和 Get-Location 报告)。 - ya23
1
你的问题说它在当前工作文件夹中解析为 foo.txt。那么 GetLocation 是不是显示它不是你的当前工作文件夹? - Tim Pietzcker
哦,我看到我把你搞糊涂了。不,这不是我的当前文件夹。我会编辑问题的。 - ya23

5
它使用该驱动器上的当前工作目录。每个进程都会“记住”每个驱动器的当前工作目录:
 C:\> cd somepath\subdir
 C:\somepath\subdir>  d:
 D:\> dir c:subsubdir       <--  refers to C:\somepath\subdir\subsubdir

请查看我对Tim Pietzcker答案的评论。 - ya23

2

以下是Harry Johnston的评论,提供的文档/解释。

MSDN --> Windows桌面应用程序 --> 开发 --> 桌面技术 --> 数据访问和存储 --> 本地文件系统 --> 文件管理 --> 关于文件管理 --> 创建、删除和维护文件 --> 命名文件、路径和命名空间 --> 完全限定 vs 相对路径

对于操作文件的Windows API函数,文件名通常可以相对于当前目录,而某些API需要完全限定的路径。如果文件名不以以下之一开头,则文件名相对于当前目录:
  • 任何格式的UNC名称,始终以两个反斜杠字符(“\”)开头。有关详细信息,请参阅下一节。
  • 带有反斜杠的磁盘标识符,例如“C:\”或“d:\”。
  • 单个反斜杠,例如“\directory”或“\file.txt”。这也称为绝对路径。
如果文件名仅以磁盘标识符开头但在冒号后没有反斜杠,则将其解释为到指定字母驱动器上的当前目录的相对路径。请注意,根据最近在该磁盘上进行的“更改目录”操作设置的内容,当前目录可能是根目录,也可能不是根目录。此格式的示例如下:
  • “C:tmp.txt”指的是驱动器C上当前目录中名为“tmp.txt”的文件。
  • “C:tempdir\tmp.txt”指的是驱动器C上当前目录的子目录中的文件。

感谢提供链接,详细解释了此帖子查询的内容。+1 - Chris22

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接