在C#中获取绝对路径

Opt*_*ion 0 c# filepath

我知道这个问题已被多次回答,而且除了一个以外,我所用的解决方案几乎适用于所有情况.

有问题的代码是这样的:

Path.GetFullPath(Path.Combine(rootFolder, relativeFilePath))
Run Code Online (Sandbox Code Playgroud)

即使使用凌乱的相对路径,UNC和绝对路径,它在大多数情况下都能正常工作,如下所示:

// These results are OK
Path.GetFullPath(Path.Combine(@"a:\b\c", @"e.txt"));    // Returns: "a:\b\c\e.txt"
Path.GetFullPath(Path.Combine(@"a:\b\c", @"..\e.txt")); // Returns: "a:\b\e.txt" 
Path.GetFullPath(Path.Combine(@"a:\b\c", @"d:\e.txt")); // Returns: "d:\e.txt"
Run Code Online (Sandbox Code Playgroud)

但是在这种情况下,它不能按预期工作:

Path.GetFullPath(Path.Combine(@"a:\b\c", @"\e.txt"))
Run Code Online (Sandbox Code Playgroud)

预期的结果是"a:\ e.txt",但代码返回"c:\ e.txt"."c:"是当前的驱动器所以它解决了拼图的一部分,但为什么会发生这种情况?有没有其他方法可以获得适用于所有情况的完整路径?

编辑:根据答案的信息,这里是有效的解决方案.可能需要一些空检查和替代目录分隔符char检查:

var rootDir = @"a:\b\c";
var filePath = @"\e.txt";
var result = (Path.IsPathRooted(filePath) && 
    Path.GetPathRoot(filePath) == Path.DirectorySeparatorChar.ToString()) ?
    Path.GetFullPath(Path.Combine(Path.GetPathRoot(rootDir), filePath.Substring(1))) :
    Path.GetFullPath(Path.Combine(rootDir, filePath));
Run Code Online (Sandbox Code Playgroud)

Ken*_* K. 5

文档中所述:

如果path2包含根,则返回path2.

path2以斜杠开头的事实使它成为一个根.

另外,在Path.GetFullPath中:

此方法使用当前目录和当前卷信息来完全限定路径.如果仅在路径中指定文件名,则GetFullPath将返回当前目录的完全限定路径.