【问题标题】:Getting absolute path in C# [duplicate]在C#中获取绝对路径[重复]
【发布时间】:2018-07-12 16:24:09
【问题描述】:

我知道这个问题已经回答了很多次,我的解决方案几乎在所有情况下都有效,除了一个。

有问题的代码是这样的:

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:” 是当前驱动器,因此它解决了部分难题,但为什么会发生这种情况?是否有另一种方法可以获得适用于所有情况的完整路径?

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

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));

【问题讨论】:

  • 推荐的答案没有多大意义。它建议删除产生完全不同结果的前导斜杠。

标签: c# filepath


【解决方案1】:

documentation中所写:

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

path2 以斜线开头这一事实使其成为根。

另外,在Path.GetFullPath:

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

【讨论】:

    【解决方案2】:

    根据文档:

    如果 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;
    }
    

    【讨论】:

    • 看起来布尔答案对于路径来说太简单了 :) 我不会认为 \somepath 是有根的,但它可能是这个错误太老了,以至于它已经成为功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 2020-04-10
    • 2015-04-14
    • 2012-09-03
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    相关资源
    最近更新 更多