为什么Path.Combine会使用相对路径生成此结果?

时间:2011-04-21 18:05:11

标签: c# .net-4.0 filesystems io

令我惊讶的是,此代码不会产生预期的结果:

var basePath = @"\\server\BaseFolder";
var relativePath = @"\My\Relative\Folder";

var combinedPath = Path.Combine(basePath, relativePath);

结果为\My\Relative\Folder,而不是预期的\\server\BaseFolder\My\Relative\Folder

这是为什么?什么是组合相对路径的最佳方法,这些路径可能有也可能没有斜杠?

编辑:我知道我可以在 relativePath 上执行字符串操作来检测并删除起始斜杠。是否有更安全的方法(我认为Path.Combine应该是安全的方式)来解释反斜杠和前沿?

3 个答案:

答案 0 :(得分:42)

删除relativePath上的前导斜杠,它应该有效。

发生这种情况的原因是Path.Combine将relativePath解释为有根(绝对)路径,因为在这种情况下,它以\开头。您可以使用Path.IsRooted()检查路径是相对路径还是根路径。

来自doc

  

如果后续路径之一是   绝对路径,然后是组合   操作从此开始重置   绝对路径,丢弃以前的所有   组合路径。

答案 1 :(得分:20)

以斜杠开头的路径被解释为绝对路径而不是相对路径。如果您想保证将relativePath视为相对的,请简单地修剪斜杠。

var basePath = @"\\server\BaseFolder";
var relativePath = @"\My\Relative\Folder";

var combinedPath = Path.Combine(basePath, relativePath.TrimStart('/', '\\'));

答案 2 :(得分:2)

根据 Path.Combine 上的 this doc,该评论指出,对于用户可能已输入值的这种情况,最好使用 Path.Join()。看起来它是在 .NET Core 3.0 中引入的

Path.Join(basePath, relativePath);

似乎唯一的区别是这种明确的场景,我们不想将我们正在组合的任何路径视为潜在的根路径。

<块引用>

与Combine 方法不同,Join 方法不会尝试对返回的路径进行root。 (也就是说,如果 path2 或 path2 或 path3 是绝对路径,Join 方法不会像 Combine 方法那样丢弃之前的路径。