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

本文关键字:vs 字符串 连接 组合 路径 存在 | 更新日期: 2023-09-27 18:18:32

所以当我正在构建一个Folder/File检查条件时,一个同事说使用Path"更好"。结合:

string finalPath = Path.Combine(folder, "file.txt"); 

而不是

string finalPath = folder +  "''file.txt";

这是"更好"的合理推理吗?"

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

这是个有趣的问题;

当然,你可以这样写:
string finalPath = String.Format("{0}''file.txt", folder); 

达到你想要的结果。

使用ILSpy,让我们看看为什么路径。联合使用效果更好。

你正在调用的重载是:

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);
}

优点是显而易见的;首先,该函数检查空值并抛出相应的异常。然后检查两个参数中的非法字符,并抛出适当的异常。一旦满足,它就调用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;
}

这里最有趣的是它支持的字符;

Path.DirectorySeparatorChar = "''"
Path.AltDirectorySeparatorChar = "/"
Path.VolumeSeparatorChar = ":"

所以它也将支持分隔符方向错误的路径(比如从一个urn file://C:/blah)

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

尝试这两个方法来查看差异....它可以处理URI和标准路径。所以一定要用Path.Combine

Console.WriteLine(Path.Combine(@"file:///c:/temp/", "x.xml"));

输出file:///c:/temp/x.xml

Console.WriteLine(Path.Combine(@"C:'test", "x.xml"));

输出C:'test'x.xml

是的,在文件路径分隔符与'

不同的情况下,它更易于移植

首先你可以用@"'file.txt代替"''file.txt";

第二,让。net关心修复路径。我们拥有它是有原因的。你可以100%确定你做的是正确的,但是如果你开始在代码的每个地方手工组合路径,总是有可能产生bug。

一个简单的例子。

  • 用户输入一个路径,你想在那里创建一个名为temp的子文件夹。你会怎么做?

如果末尾没有反斜杠,则添加一个,否则执行此操作,否则执行另一个…等。使用Path.Combine(),您不必进行检查。

加上其他注释,它可以组合您想要创建的目录的许多部分。

例如:

Path.Combine(root, nextFolder, childfolder, file);

当它接收字符串数组时,它支持多个字符,因此它能够在单个执行的行中创建正确的目录。

认为,