Как получить .NET Path.Combine для преобразования косых черт в обратную косую черту?
Я использую Path.Combine следующим образом:
Path.Combine("test1/test2", "test3\\test4");
Выход, который я получаю:
test1/test2\test3\test4
Обратите внимание, что косая черта не преобразуется в обратную косую черту. Я знаю, что могу сделать string.Replace, чтобы изменить его, но есть ли лучший способ сделать это?
Ответы
Ответ 1
Поскольку ваш "test1/test2" уже является строковым литералом, Path.Combine не изменит "/" для вас на "\".
Path.Combine будет конкатрировать только 2 строковых литерала с соответствующим ограничителем пути, используемым ОС, в этом случае Windows, которая является "\", оттуда выдает ваш вывод
test1/test2\test3\test4
Лучше всего будет строка. Замените.
Ответ 2
Как уже говорили другие, Path.Combine не меняет разделитель. Однако, если вы преобразуете его в полный путь:
Path.GetFullPath(Path.Combine("test1/test2", "test3\\test4"))
полученный полный путь будет использовать стандартный разделитель каталогов (обратная косая черта для Windows).
Обратите внимание, что это работает в Windows, потому что\и/являются допустимыми разделителями пути:
Path.DirectorySeparatorChar = \
Path.AltDirectorySeparatorChar = /
Если вы работаете, скажем, на .NET Core 2.0 в Linux, то только прямая косая черта является допустимым разделителем пути:
Path.DirectorySeparatorChar = /
Path.AltDirectorySeparatorChar = /
и в этом случае он не преобразует обратную косую черту в прямую, так как обратная косая черта не является допустимым разделителем альтернативных путей.
Ответ 3
Попробуйте использовать класс Uri
. Он создаст действительный Uris для правильной целевой машины (/
→ \
).
Ответ 4
Во-первых, я бы спорил в этом конкретном случае, было бы неразумно делать одно .Replace()
Во-вторых, вы также можете использовать System.Uri для форматирования своего пути, он очень строгий. Однако это будет больше строк, чем простое .Replace(). Я, по-моему, голосую за то, что вы просто используете .Replace() быть с этим! Надеюсь, что поможет
Ответ 5
Используя .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, чтобы определить, какой из них лучше всего подходит вам.
Ответ 6
Нет, символ разделителя определяется как только для чтения.
http://msdn.microsoft.com/en-us/library/system.io.path.pathseparator.aspx
Вы должны использовать Replace, поскольку это тривиальное изменение.