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

Bra*_*don 31 c# filesystems io .net-4.0

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

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

var combinedPath = Path.Combine(basePath, relativePath);
Run Code Online (Sandbox Code Playgroud)

结果\My\Relative\Folder不是预期的结果\\server\BaseFolder\My\Relative\Folder.

为什么是这样?将相对路径组合在一起的最佳方法是什么?这些路径可能有也可能没有斜线?

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

Jas*_*yon 44

删除前导斜杠relativePath,它应该工作.

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

来自doc:

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

  • 多么愚蠢的事情..如果我需要修剪字符串的开始/结束等,为什么我会首先使用Path.Combine? (7认同)
  • 历史上有没有一个用例是任何人都希望它工作的? (2认同)

Gre*_*reg 20

以斜杠开头的路径被解释为绝对路径而不是相对路径.如果你想保证relativePath将被视为相对的,只需修剪斜线.

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

var combinedPath = Path.Combine(basePath, relativePath.TrimStart('/', '\\'));
Run Code Online (Sandbox Code Playgroud)


Jam*_*Esh 6

根据此文档,注释Path.Combine指出最好用于Path.Join()用户可能已输入值的情况。看起来它是随 .NET Core 3.0 引入的

Path.Join(basePath, relativePath);
Run Code Online (Sandbox Code Playgroud)

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

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