令我惊讶的是,这种代码不会产生预期的结果:
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
应该是安全的方式),将占到反斜线和frontslashes?
砸relativePath
领先的斜线,它应该工作。
之所以出现这种情况的原因是,Path.Combine作为一个植根(绝对)路径解释relativePath
,因为在这种情况下,用\
开始。您可以检查是否是相对路径或使用Path.IsRooted()
扎根。
从doc:
如果随后的路径的一个是绝对路径,则该结合开始与绝对路径操作复位,丢弃所有先前组合的路径。
以斜杠开始的路径被解释为是绝对的,而不是相对的。如果你想保证relativePath
会相对被视为简单的修剪斜线关闭。
var basePath = @"\\server\BaseFolder";
var relativePath = @"\My\Relative\Folder";
var combinedPath = Path.Combine(basePath, relativePath.TrimStart('/', '\\'));