【问题标题】:Path.Combine doesn`t work properlyPath.Combine 无法正常工作
【发布时间】:2014-11-06 12:30:13
【问题描述】:

我有

string path = "path";
string newPath = Path.Combine(path, "/jhjh/klk");

我希望结果是newPth = path/"/jhjh/klk"

但请改用"/jhjh/klk"

方法调用有什么问题?

【问题讨论】:

  • "/jhjh" 意思是“去根目录,然后进入jhjh。去掉前面的斜杠。
  • Path.Combine 工作正常的假设开始,并且您还不了解它的作用。这样会更有成效。

标签: c# path


【解决方案1】:

Combine 会为你添加斜线,所以就这样做

string newPath = Path.Combine("path", @"jhjh\klk");

【讨论】:

  • 额外的数据类有什么用?你只需要最后一句话?
  • @RvdK OP 修改了原来的问题,我只是回答了问题
【解决方案2】:

来自Path.Combine method

组合路径。如果指定路径之一的长度为零 字符串,此方法返回另一个路径。 如果 path2 包含一个 绝对路径,此方法返回path2

Path.Combine 方法implemented as;

public static String Combine(String path1, String path2) {
        if (path1==null || path2==null)
            throw new ArgumentNullException((path1==null) ? "path1" : "path2");
        Contract.EndContractBlock();
        CheckInvalidPathChars(path1);
        CheckInvalidPathChars(path2);

        return CombineNoChecks(path1, path2);
}

这里怎么CombineNoChecks方法implemented;

private static String CombineNoChecks(String path1, String path2) {
        if (path2.Length == 0)
            return path1;

        if (path1.Length == 0)
            return path2;

        if (IsPathRooted(path2))
            return path2;

        char ch = path1[path1.Length - 1];
        if (ch != DirectorySeparatorChar && ch != AltDirectorySeparatorChar && ch != VolumeSeparatorChar) 
            return path1 + DirectorySeparatorChar + path2;
        return path1 + path2;
    }

IsPathRooted方法implemented;

public static bool IsPathRooted(String path) {
if (path != null) {

    int length = path.Length;
    if ((length >= 1 && (path[0] == DirectorySeparatorChar || path[0] == AltDirectorySeparatorChar))
#if !PLATFORM_UNIX                       
         || (length >= 2 && path[1] == VolumeSeparatorChar)
#endif
         ) return true;
    }
    return false;
}

在你的情况下(path2/jhjh/klk)这使得你的 path[0]/。这就是你的path[0] == DirectorySeparatorCharlength >= 1 表达式返回true 的原因,这就是你的IsPathRooted 方法返回true 的原因,这就是你的CombineNoChecks 方法返回path2 的原因。

【讨论】:

  • 出于兴趣,为什么要展示实现?完全可以通过阅读文档来分析这一点,我个人认为鼓励新手这样做会更好。正如所写的那样,这似乎向新手表明,学习如何使用像Path.Combine 这样的方法的方法是获取源代码并阅读它。
  • @DavidHeffernan 我认为也显示源代码会更好地阅读和理解绝对路径和相对路径究竟是如何以及是什么。阅读文档也很好,但挖掘源代码总是一个加分项。当然,这只是口味问题。
  • 我们只需要同意在这里不同意。在这一点上,我与你完全不同。 :-)
  • @DavidHeffernan 先生,我很高兴不同意您的观点,前提是我们都提供相同的解决方案:)
【解决方案3】:

来自documentation

如果 path2 包含绝对路径,则此方法返回 path2。

这是你的场景。您将绝对路径作为第二个参数传递,因此返回的是绝对路径。

也许您的错误是您将绝对路径作为第二个参数传递,但打算传递相对路径。 "/jhjh/klk" 以路径分隔符开头这一事实使其成为绝对路径。

【讨论】:

    猜你喜欢
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-01
    • 2012-07-11
    • 2018-04-08
    • 2017-04-20
    • 2018-10-02
    • 2016-09-04
    相关资源
    最近更新 更多