将包含驱动器号的相对路径转换为.NET文件函数的绝对路径

时间:2010-12-06 20:58:16

标签: c# .net .net-4.0 c#-4.0

如何将驱动器相对路径(如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:\'

4 个答案:

答案 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命令允许您省略引号 包含空格的路径:由于该命令仅采用一个路径 论点,缺少引号不会引起歧义。