令我惊讶的是,此代码不会产生预期的结果:
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
应该是安全的方式)来解释反斜杠和前沿?
答案 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 方法那样丢弃之前的路径。