我正在使用Path.Combine:
Path.Combine("test1/test2", "test3\\test4");
我得到的输出是:
test1/test2\test3\test4
注意正斜杠如何不转换为反斜杠。我知道我可以做string.Replace改变它,但是有更好的方法吗?
答案 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
你应该使用替换,因为这是一个微不足道的改变。