为什么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('/', '\\'));