我知道这个问题已经回答了很多次,除了一个问题,几乎所有情况下我都可以使用该解决方案。
有问题的代码是这样的:
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));
答案 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;
}