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命令允许您省略周围的引号。)
包含空格的路径:因为命令只采用一条路径
在论证中,缺少引号并不会引起歧义
但是,当前工作目录位于不同的目录上