小编典典

为什么 Path.Combine 不能正确连接以 Path.DirectorySeparatorChar 开头的文件名?

all

在 Visual Studio的 即时窗口中:

> Path.Combine(@"C:\x", "y")
"C:\\x\\y"
> Path.Combine(@"C:\x", @"\y")
"\\y"

看来他们应该是一样的。

旧的 FileSystemObject.BuildPath() 不能这样工作......


阅读 79

收藏
2022-06-20

共1个答案

小编典典

这是一个哲学问题(也许只有微软才能真正回答),因为它完全按照文档所说的那样做。

System.IO.Path.Combine

“如果 path2 包含绝对路径,则此方法返回 path2。”

这是来自
.NET
源代码的实际组合方法。您可以看到它调用了CombineNoChecks,然后它在
path2
上调用IsPathRooted并返回该路径(如果是):

public static String Combine(String path1, String path2) {
    if (path1==null || path2==null)
        throw new ArgumentNullException((path1==null) ? "path1" : "path2");
    Contract.EndContractBlock();
    CheckInvalidPathChars(path1);
    CheckInvalidPathChars(path2);

    return CombineNoChecks(path1, path2);
}

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

我不知道理由是什么。我想解决方案是从第二条路径的开头剥离(或修剪)DirectorySeparatorChar;也许编写您自己的组合方法,然后调用
Path.Combine()。

2022-06-20