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

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

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应该是安全的方式)来解释反斜杠和前沿?

删除relativePath上的前导斜杠,它应该可以工作。

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

从文档 :

如果后续路径之一是绝对路径,则组合操作从该绝对路径开始重置,丢弃所有先前组合路径。

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

 var basePath = @"\\server\BaseFolder"; var relativePath = @"\My\Relative\Folder"; var combinedPath = Path.Combine(basePath, relativePath.TrimStart('/', '\\'));