【问题标题】:Why does Path.Combine produce this result with a relative path?为什么 Path.Combine 用相对路径产生这个结果?
【发布时间】:2023-03-08 18:46:01
【问题描述】:

令我惊讶的是,这段代码没有产生预期的结果:

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

【问题讨论】:

  • 这不是相对路径。
  • 我会明白,如果前面有 2 个反斜杠,使其成为 UNC 路径,但只有一个斜杠?认真的吗?
  • 是的;严重地。 \a\b 是一个绝对路径。 (虽然它是相对于驱动器)

标签: c# .net-4.0 filesystems io


【解决方案1】:

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

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

var combinedPath = Path.Combine(basePath, relativePath.TrimStart('/', '\\'));

【讨论】:

    【解决方案2】:

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

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

    来自doc

    如果后续路径之一是 绝对路径,然后结合 操作从那个开始重置 绝对路径,丢弃所有以前的 组合路径。

    【讨论】:

    • 多么愚蠢的事情。如果我需要修剪字符串的开始/结束等。为什么我首先要使用 Path.Combine?
    • 历史上是否有一个用例是任何人都希望这样做的??
    【解决方案3】:

    根据Path.Combine 上的this doc,备注指出,对于用户可能已输入值的这种情况,最好使用Path.Join()。看起来它是在 .NET Core 3.0 中引入的

    Path.Join(basePath, relativePath);
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      • 2013-07-14
      • 1970-01-01
      相关资源
      最近更新 更多