如何将驱动器相对路径(如D:test.xml)转换为XDocument.Load()等函数将接受的绝对路径。例如,D驱动器可以将D:\ data作为其当前工作目录,因此D:test.xml将表示D:\ data \ test.xml。我已经尝试过像D:。\ test.xml这样的混合。
以下是我得到的类似D的错误:test.xml:无效的URI:Dos路径必须是root,例如'c:\'
答案 0 :(得分:5)
您可以使用GetFullPath
。例如:
// should return "D:\data\test.xml" if the current working dir is "D:\data"
string absolutePath = Path.GetFullPath("D:test.xml");
答案 1 :(得分:2)
您应该只使用“test.xml”作为相对路径,如果当前文件夹是“D:\ data”,则完整路径将解析为“D:\ Data \ test.xml”。这在Load()方法的MSDN示例中也有说明:http://msdn.microsoft.com/en-us/library/bb343181.aspx
请注意“driveLetter:fileName”不是.Net中的相对路径。(请阅读更新)
您可以使用Path.GetFullPath()将相对路径转换为完整路径,但您不必执行该操作,因为它也会接受相对路径。
<强>更新强> 卢克,感谢你指出这一点! Path.GetFullPath()接受“driveLetter:fileName”,并将其计算为指定驱动器的当前目录的相对路径,如指定here。
驱动器级别的当前目录的概念继承自DOS的旧时代。不一定是我构建现代应用程序的功能。
答案 2 :(得分:1)
Path.GetFullPath可以工作。见the doc here
答案 3 :(得分:0)
如Luke的answer中所述,解决方案归因于当前工作目录的使用方式。作为该答案的附录,这里是一些背景。当前工作目录是否为每个驱动器 似乎存在奇怪的行为。这是blog article from Raymond Chen of Microsoft来解释的。
我不得不四处寻找才能找到一个好的链接,所以我也复制了内容以防万一。
为什么每个驱动器都有自己的当前目录?
评论员Dean Earley问:“为什么存在“当前目录”,并且 当前驱动器?为什么不合并它们?”
Pithy回答:最初,每个驱动器都有自己的当前目录, 但是现在他们没有了,但是看起来像他们一样。
好的,让我们解开那句话。你实际上知道足够回答 自己问问题;您只需要将各个部分放在一起。
将Wayback机器设置为DOS 1.0。每个卷都用一个 盘符。没有子目录。此行为被执行 从CP / M转发。
DOS 1.0时代的程序不了解子目录;它不支持子目录。他们 仅通过驱动器号和文件名来引用文件,例如, B:PROGRAM.LST。让我们启动汇编器(编译器是为了丰富 人),并汇编源代码在A驱动器上的程序, 但是将输出发送到B驱动器。
A>asm foo the ".asm" extension on "foo" is implied Assembler version blah blah blah Source File: FOO.ASM Listing file [FOO.LST]: NUL throw away the listing file Object file [FOO.OBJ]: B: send the object file to drive B Since we gave only a drive letter in response to the Object file prompt, the assembler defaults to a file name of FOO.OBJ, resulting in
目标文件生成为B:FOO.OBJ。
好的,现在让我们将子目录引入DOS 2.0。假设你 要组装A:\ SRC \ FOO.ASM并将结果放入 B:\ OBJ \ FOO.OBJ。操作方法如下:
A> B: B> CD \OBJ B> A: A> CD \SRC A> asm foo Assembler version blah blah blah Source File: FOO.ASM Listing file [FOO.LST]: NUL Object file [FOO.OBJ]: B:
汇编器从A:FOO.ASM读取并写入B:FOO.OBJ,但是由于 当前目录基于每个驱动器进行跟踪,结果为 根据需要A:\ SRC \ FOO.ASM和B:\ OBJ \ FOO.OBJ。如果当前目录 没有按驱动器进行跟踪,那么就没有办法 告诉汇编器将其输出放入子目录。结果是, DOS 1.0程序实际上仅限于对文件中的文件进行操作。 根目录,这意味着没有人将文件放入 子目录(因为他们的程序无法访问它们)。
从DOS 1.0的角度来看,更改驱动器上的当前目录 执行更改介质的逻辑等效。 “哦,看, 完全不同的文件集!”
注意力跨度短。
记住每个驱动器的当前目录 从那时起,至少对于批处理文件,尽管实际上并没有 这样的概念就是Win32中每个驱动器的当前目录。在Win32中 您所拥有的只是当前目录。每个驱动器的外观 有自己的当前目录是cmd.exe的伪造品,它使用 奇怪的环境变量对批处理文件产生错觉 每个驱动器都有自己的当前目录。
Dean继续说道:“为什么不合并它们?我必须同时设置dir和 驱动器,如果我想要一个特定的工作目录。“
第二个问题的答案是:“它们已经合并。 cmd.exe试图假装它们不是。”如果您想 在命令提示符或批处理中设置目录和驱动器 文件,只需对CHDIR命令使用/ D选项:
D:\> CD /D C:\Program Files\Windows NT C:\Program Files\Windows NT> _
(请注意,CHDIR命令允许您省略引号 包含空格的路径:由于该命令仅采用一个路径 论点,缺少引号不会引起歧义。