在C#中获取绝对路径

时间:2018-07-12 16:24:09

标签: c# filepath

我知道这个问题已经回答了很多次,除了一个问题,几乎所有情况下我都可以使用该解决方案。

有问题的代码是这样的:

Path.GetFullPath(Path.Combine(rootFolder, relativeFilePath))

即使在相对混乱的相对路径,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"

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

Path.GetFullPath(Path.Combine(@"a:\b\c", @"\e.txt"))

预期结果为“ a:\ e.txt”,但是代码返回“ c:\ e.txt”。 “ c:”是当前驱动器,因此它可以解决部分难题,但是为什么会发生这种情况?是否有另一种方法可以获取适用于所有情况的完整路径?

编辑:根据答案中的信息,这里提供了有效的解决方案。不过可能需要进行一些null检查和备用目录分隔符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));

2 个答案:

答案 0 :(得分:5)

documentation中所述:

  

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

path2以斜杠开头的事实使其成为根。

此外,在Path.GetFullPath中:

  

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

答案 1 :(得分:1)

根据文档:

  

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

查看reference source,我们可以看到,如果路径以“ \”开头,则认为该路径包含根。

// Tests if the given path contains a root. A path is considered rooted
// if it starts with a backslash ("\") or a drive letter and a colon (":").
//
[Pure]
public static bool IsPathRooted(String path) {
    if (path != null) {
        CheckInvalidPathChars(path);

        int length = path.Length;
        if ((length >= 1 && (path[0] == DirectorySeparatorChar || path[0] == AltDirectorySeparatorChar)) || (length >= 2 && path[1] == VolumeSeparatorChar))
             return true;
    }
    return false;
}