Подтвердить что ты не робот

Как получить .NET Path.Combine для преобразования косых черт в обратную косую черту?

Я использую Path.Combine следующим образом:

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

Выход, который я получаю:

test1/test2\test3\test4

Обратите внимание, что косая черта не преобразуется в обратную косую черту. Я знаю, что могу сделать string.Replace, чтобы изменить его, но есть ли лучший способ сделать это?

4b9b3361

Ответ 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, чтобы определить, какой из них лучше всего подходит вам.