如何让.NET的Path.Combine将正斜杠转换为反斜杠?

时间:2010-06-29 20:30:22

标签: c# .net

我正在使用Path.Combine:

Path.Combine("test1/test2", "test3\\test4");

我得到的输出是:

test1/test2\test3\test4

注意正斜杠如何不转换为反斜杠。我知道我可以做string.Replace改变它,但是有更好的方法吗?

8 个答案:

答案 0 :(得分:88)

正如其他人所说,Path.Combine不会更改分隔符。 但是,如果将其转换为完整路径:

Path.GetFullPath(Path.Combine("test1/test2", "test3\\test4"))

生成的完全限定路径将使用标准目录分隔符(Windows的反斜杠)。

请注意,这适用于Windows,因为\和/都是合法的路径分隔符:

Path.DirectorySeparatorChar = \
Path.AltDirectorySeparatorChar = /

如果你在Linux上运行.NET Core 2.0,只有正斜杠是合法的路径分隔符:

Path.DirectorySeparatorChar = /
Path.AltDirectorySeparatorChar = /

在这种情况下,它不会将反斜杠转换为正斜杠,因为反斜杠不是合法的备用路径分隔符。

答案 1 :(得分:22)

因为你的“test1 / test2”已经是一个字符串文字,所以Path.Combine不会将'/'更改为'\'。

Path.Combine只会使用操作系统使用的相应路径分隔符连接2个字符串文字,在这种情况下,Windows,即'\',从那里输出

test1/test2\test3\test4

你最好的选择是string.Replace。

答案 2 :(得分:18)

尝试使用Uri课程。它将为正确的目标计算机创建有效的Uris(/ - > \)。

答案 3 :(得分:2)

首先,我会在这个特殊情况下争论,做一个单独的.Replace()

是不合理的。

其次,你也可以使用System.Uri格式化你的路径,这是非常严格的。但是,这将比简单的.Replace()更多行。我很好地投票给你使用.Replace()完成它!希望有所帮助

答案 4 :(得分:1)

使用.NET Reflector,您可以看到Path.Combine不会更改提供的字符串中的斜杠

public static string Combine(string path1, string path2)
{
    if ((path1 == null) || (path2 == null))
    {
        throw new ArgumentNullException((path1 == null) ? "path1" : "path2");
    }
    CheckInvalidPathChars(path1);
    CheckInvalidPathChars(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 + DirectorySeparatorChar + path2);
    }
    return (path1 + path2);
}

您可以使用String.Replace和Uri类方法执行相同操作,以确定哪种方法最适合您。

答案 5 :(得分:1)

如果您需要结果使用正斜杠而不是反斜杠,并且如果您的第一个路径部分是绝对路径(即根目录),则可以使用Uri类将其合并:

string CombinedPath = new Uri(new Uri("C:/test1/test2"), "test3\\test4").AbsolutePath;

请注意,如果第一个组件也是相对路径,则此操作将无效。

答案 6 :(得分:1)

尝试使用

var fullname = new DirectoryInfo(Path.Combine("f:/","test1/test2", "test3\\test4")).FullName;

这将导致

f:\test1\test2\test3\test4

答案 7 :(得分:-3)

不,分隔符被定义为只读。

http://msdn.microsoft.com/en-us/library/system.io.path.pathseparator.aspx

你应该使用替换,因为这是一个微不足道的改变。