目录存在路径组合与字符串连接

6 c# filesystems directory

因此,当我构建一个有条件的文件夹/文件检查时,同事说使用Path.Combine"更好":

string finalPath = Path.Combine(folder, "file.txt"); 
Run Code Online (Sandbox Code Playgroud)

而不是我这样做的方式

string finalPath = folder +  "\\file.txt";
Run Code Online (Sandbox Code Playgroud)

任何合理的推理都"更好"?

das*_*ash 7

这是一个有趣的问题;

当然,你可以这样写:

string finalPath = String.Format("{0}\\file.txt", folder); 
Run Code Online (Sandbox Code Playgroud)

达到你想要的效果.

但是,使用ILSpy可以看出为什么Path.Combine更好.

您调用的重载是:

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);
}
Run Code Online (Sandbox Code Playgroud)

优势显而易见; 首先,该函数检查空值并抛出相应的异常.然后它检查任一参数中的非法字符,并抛出适当的异常.一旦满足,它会调用Path.CombineNoChecks:

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;
}
Run Code Online (Sandbox Code Playgroud)

这里最有趣的是它支持的角色;

Path.DirectorySeparatorChar = "\\"
Path.AltDirectorySeparatorChar = "/"
Path.VolumeSeparatorChar = ":"
Run Code Online (Sandbox Code Playgroud)

所以它也会支持分隔符错误的路径(比如从urn那里file://C:/blah)

简而言之,它更好,因为它为您提供了验证,一定程度的可移植性(上面显示的3个常量可以在每个框架-OS的基础上定义),并且支持您经常遇到的多种类型的路径.