【问题标题】:Directory Exists with Path Combine vs String Concatenation目录存在路径组合与字符串连接
【发布时间】:2013-06-10 12:28:44
【问题描述】:

所以当我正在构建一个文件夹/文件检查条件时,一位同事说使用 Path.Combine “更好”:

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

与我使用的方式相反

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

有任何合理的理由认为这是“更好”吗?

【问题讨论】:

  • 我发现了一个我实际上需要双反斜杠的情况......当我写入一个 .il 文件时,Cadence Allegro 用它的 SKILL 语言读取,但除此之外,应用程序的其他部分我将使用 Path.Combine。谢谢大家。

标签: c# directory filesystems


【解决方案1】:

这是一个有趣的问题;

当然,你可以这样写:

string finalPath = String.Format("{0}\\file.txt", folder); 

达到你想要的结果。

不过,使用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);
}

优势明显;首先,该函数检查空值并抛出适当的异常。然后它检查任一参数中的非法字符,并引发适当的异常。一旦满足,它就会调用 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 = ":"

因此它还将支持分隔符错误的路径(例如来自瓮中的file://C:/blah

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

【讨论】:

    【解决方案2】:

    试试这两个看看区别....它可以处理 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

    【讨论】:

      【解决方案3】:

      是的,在文件路径分隔符与\不同的情况下更便携

      【讨论】:

      • +1 它还有助于避免使用魔法字符串,例如Path.Combine(folder, file)folder + "\\" + file 好得多(尽管您可以使用 DirectorySeparatorChar
      【解决方案4】:

      首先你可以使用@"\file.txt这个符号来代替"\\file.txt";

      其次,让 .Net 关心修复路径。我们拥有它是有原因的。 您可以 100% 确定自己已正确完成,但如果您开始在代码中的任何地方手动组合路径,则总是有机会产生错误。

      一个简单的例子。

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

      如果末尾没有反斜杠,则添加一个,否则执行此操作,否则执行另一个...等等。 使用Path.Combine(),您无需进行检查。您可以专注于应用程序的实际逻辑。

      【讨论】:

        【解决方案5】:

        一个真正可以加上其他 cmets 的东西,它能够组合您想要创建的目录的许多部分。

        例如是这样的:

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

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

        问候,

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-14
          • 2016-12-26
          • 2011-06-27
          • 2014-10-29
          • 2020-05-18
          • 2011-11-09
          相关资源
          最近更新 更多