因此,当我正在构建一个文件夹/文件检查条件时,一位同事说使用 Path.Combine 会“更好”:
string finalPath = Path.Combine(folder, "file.txt");
与我的做法相反
string finalPath = folder + "\\file.txt";
任何合理的推理这是“更好的”?
因此,当我正在构建一个文件夹/文件检查条件时,一位同事说使用 Path.Combine 会“更好”:
string finalPath = Path.Combine(folder, "file.txt");
与我的做法相反
string finalPath = folder + "\\file.txt";
任何合理的推理这是“更好的”?
这是一个有趣的问题;
当然,您可以编写如下内容:
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 = ":"
因此它还将支持分隔符错误的路径(例如来自 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% 确定您已正确完成,但如果您开始在代码中的任何地方手动组合路径,总有机会产生错误。
一个简单的例子。
temp
。你会怎么做?如果末尾没有反斜杠,请添加一个,否则执行此操作,否则执行另一个...等等。Path.Combine()
您不必进行检查。您可以专注于应用程序的实际逻辑。
一个真正可以加上其他评论的东西,它是组合您想要创建的目录的许多部分的能力。
例如:
Path.Combine(root, nextFolder, childfolder, file);
它支持许多字符,因为它接收一个字符串数组,因此它能够在一个执行的行中创建正确的目录。
问候,