使用Path.Combine相对于用'+'连接字符串的优势是什么?

44

我并不完全看得出其中的区别。

Path.Combine相较于完美工作的字符串连接,有什么更出色的表现吗?

我猜它在后台执行的是非常类似的操作。

有人能告诉我为什么经常会被优先选择使用吗?


2
使用Path.Combine的第一个和最大的好处是它会自动处理斜杠问题,即您无需担心添加''或'/'等。关于后台进程,请阅读此处 - PM.
5
使用Path.Combine的代码在使用Mono时可以在Linux和Mac上无需更改即可工作。 - Enigmativity
6个回答

46

Path.Combine使用Path.PathSeparator,并检查第一个路径是否已经在末尾有分隔符,以避免重复分隔符。此外,它还检查合并的路径元素是否存在无效字符。


1
最终,这只是一个带有额外检查的“升级版”连接操作吗? - Sossenbinder
1
我不确定你所说的“升级”是什么意思,但你可以在这里简单地检查源代码:http://referencesource.microsoft.com/#mscorlib/system/io/path.cs 你应该始终使用Combine而不是自定义连接。 - György Kőszeg
需要注意的是,它会进行一些无效字符检查(控制码和| "<>),但如果您使用通配符进行全局匹配,则会让它们通过。 - Paul Childs

20

Path.Combine不仅是一个字符串拼接功能。如果你查看源代码,它还有以下功能:

  • 检查两个路径是否有无效字符
  • 检查第二个参数是否为根路径
  • 检查第一个路径的最后一个字符是否是目录、备用目录或卷分隔符。 如果不是,则在两个字符串之间使用目录分隔符来连接它们

5

以下是实现方式:

public static string Combine(string path1, string path2)
{
    if (path1 == null || path2 == null)
    {
        throw new ArgumentNullException((path1 == null) ? "path1" : "path2");
    }
    Path.CheckInvalidPathChars(path1, false);
    Path.CheckInvalidPathChars(path2, false);
    return Path.CombineNoChecks(path1, path2);
}

private static string CombineNoChecks(string path1, string path2)
{
    if (path2.Length == 0)
    {
        return path1;
    }
    if (path1.Length == 0)
    {
        return path2;
    }
    if (Path.IsPathRooted(path2))
    {
        return path2;
    }
    char c = path1[path1.Length - 1];
    if (c != Path.DirectorySeparatorChar && c != Path.AltDirectorySeparatorChar && c != Path.VolumeSeparatorChar)
    {
        return path1 + Path.DirectorySeparatorChar + path2;
    }
    return path1 + path2;
}

4
根据这份文档Path.Combine内部使用+-运算符进行字符串连接。
 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 + DirectorySeparatorCharAsString + path2;
        return path1 + path2;
    }

2

您需要避免使用双斜线。如果路径元素已经有一个前导反斜杠,Path.Combine会检查并确保只有一个斜杠存在。


1
System.IO.Path.Combine() 通过使用正确的路径分隔符(即正斜杠'/'或反斜杠''),自动将多个路径组合成一个字符串,以适应操作系统OS。 另一方面,使用字符串连接也可以实现相同的效果,但我们需要在路径之后或之前显式(手动)添加正确的路径分隔符。 例如:
   string virtualPath = "/data/directory" +"/" + "video.mp4";

使用Path.Combine()函数时,
string virtualPath = Path.Combine("/data/directory", "video.mp4");

无论是使用Path.Combine()方法还是字符串拼接方法,都能得到相同的结果,但Path.Combine()方法提供了一种更优雅的路径组合方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接