Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将包含驱动器号的相对路径转换为.NET文件函数的绝对路径_C#_.net_.net 4.0_C# 4.0 - Fatal编程技术网

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

C# 将包含驱动器号的相对路径转换为.NET文件函数的绝对路径,c#,.net,.net-4.0,c#-4.0,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路径必须是根路径,例如“c:\” 你可以用。例如: // should return "D:\data\test.xml" if the current w

如何将驱动器相对路径(如
D:test.xml
)转换为函数(如
XDocument.Load()
)将接受的绝对路径。例如,D驱动器可以将
D:\data
作为其当前工作目录,因此
D:test.xml
表示
D:\data\test.xml
。我已经试过像
D:.\test.xml
这样的混合物

下面是我遇到的类似
D:test.xml的错误:

无效URI:Dos路径必须是根路径,例如“c:\”

你可以用。例如:

// should return "D:\data\test.xml" if the current working dir is "D:\data"
string absolutePath = Path.GetFullPath("D:test.xml");
如果CWD是
“D:\Data”
Path.GetFullPath(“D:test.xml”)
确实会返回
“D:\Data\test.xml”
,因为它会直接获取“test.xml”的完整路径

但是,如果使用与CWD不同的驱动器号,结果将不一致。例如
Path.GetFullPath(“C:test.xml”)
将返回
“C:\test.xml”。

这是故意的。看一看

如果文件名仅以磁盘指示符开头,而不是以 冒号后的反斜杠将被解释为到 驱动器上具有指定字母的当前目录。注意 当前目录可能是根目录,也可能不是根目录,具体取决于 在最近的“更改目录”期间设置的内容 磁盘上的操作


[我添加的强调]

Path.GetFullPath可以工作。请参见您只需使用“test.xml”作为相对路径,如果当前文件夹为“D:\data”,则完整路径将解析为“D:\data\test.xml”。Load()方法的MSDN示例中也说明了这一点:

请注意,“driveLetter:fileName”在.Net中不是相对路径。(请阅读更新)

您可以使用path.GetFullPath()将相对路径转换为完整路径,但您不必这样做XDocument.Load(),因为它也将接受相对路径

更新 卢卡,谢谢你指出这一点!Path.GetFullPath()接受“driveLetter:fileName”,并将其作为指定驱动器当前目录的相对路径进行计算

驱动器级当前目录的概念是从非常古老的DOS时代继承下来的。不一定是我构建现代应用程序的一个功能。

正如Luke在书中提到的,解决方案取决于当前工作目录的使用方式。作为这个答案的补充,这里有一些背景。当前工作目录是否为每个驱动器似乎有一种奇怪的行为。这里有一个例子可以解释这一点

为了找到一个好的链接,我不得不四处搜索,所以我也复制了内容,以防它坏掉

为什么每个驱动器都有自己的当前目录? 评论员迪安·厄利问道:“为什么会有‘当前目录’和 当前驱动器?为什么不合并它们?”

简单回答:最初,每个驱动器都有自己的当前目录, 但现在他们没有,但看起来他们有

好吧,让我们把那句话拆开。你知道的足够多,可以回答 你自己的问题;你只需要把这些碎片拼在一起

将回程机器设置为DOS 1.0。每个卷都由一个 驱动器号。没有子目录。这种行为被执行 从CP/M转发

DOS1.0时代的程序不理解子目录;他们 例如,仅通过驱动器号和文件名引用文件, B:PROGRAM.LST。让我们启动汇编程序(编译器是为rich设计的) 并汇编源代码位于驱动器上的程序, 但是将输出发送到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的对象文件

好的,现在让我们在DOS2.0中引入子目录。假设你 您希望组装一个:\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程序实际上仅限于在 根目录,这意味着没有人会将文件放入 子目录(因为它们的程序无法访问它们)

从DOS1.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命令允许您省略周围的引号。) 包含空格的路径:因为命令只采用一条路径 在论证中,缺少引号并不会引起歧义


但是,当前工作目录位于不同的目录上