【发布时间】: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));
【问题讨论】:
-
推荐的答案没有多大意义。它建议删除产生完全不同结果的前导斜杠。