我错误地输入了一条路径而不是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。
我还没有找到任何相关文档,我完全糊涂了,请解释一下这个行为。
答案 0 :(得分:7)
如果指定带有驱动器号但没有初始反斜杠的路径,则通常被解释为指定驱动器上当前目录的相对路径。特别是,这是普通的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文件夹。
答案 1 :(得分:6)
这是标准的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
驱动器号始终引用该驱动器的当前目录; (领先)反斜杠将您带到顶级目录。
答案 2 :(得分:3)
它使用该驱动器上的当前工作目录。每个过程都记得"每个驱动器的当前工作目录:
C:\> cd somepath\subdir
C:\somepath\subdir> d:
D:\> dir c:subsubdir <-- refers to C:\somepath\subdir\subsubdir
答案 3 :(得分:0)
这是文件/解释,由Harry Johnston comment提供。
MSDN - &gt; Windows桌面应用程序 - &gt; 开发 - &gt; 桌面技术 - &gt; 数据访问和存储 - &gt; 本地文件系统 - &gt; 文件管理 - &gt; 关于文件管理 - &gt; 创建,删除和维护文件 - &gt; 命名文件,路径和命名空间 - &gt; Fully Qualified vs. Relative Paths
对于操作文件的Windows API函数,通常可以使用文件名 相对于当前目录,而某些API需要完全 合格的道路。文件名是相对于当前目录的 不会以下列之一开头:
- 任何格式的UNC名称,始终以两个反斜杠字符开头(&#34; \&#34;)。有关详细信息,请参阅下一节。
- 带有反斜杠的磁盘指示符,例如&#34; C:\&#34;或&#34; d:\&#34;。
- 单个反斜杠,例如&#34; \ directory&#34;或&#34; \ file.txt&#34;。这也称为绝对路径。
如果文件名仅以磁盘指示符开头而不是 冒号后的反斜杠,它被解释为相对路径 具有指定字母的驱动器上的当前目录。注意 当前目录可能是也可能不是根目录 在最近的&#34;更改目录&#34;中设置的内容 该磁盘上的操作。此格式的示例如下:
- &#34; C:tmp.txt&#34;是指一个名为&#34; tmp.txt&#34;的文件。在驱动器C上的当前目录中。
- &#34; C:TEMPDIR \ tmp.txt&#34;指的是驱动器C上当前目录的子目录中的文件。
[...]