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

Почему Path.Combine производит этот результат с относительным путем?

К моему удивлению, этот код не дает ожидаемых результатов:

var basePath = @"\\server\BaseFolder";
var relativePath = @"\My\Relative\Folder";

var combinedPath = Path.Combine(basePath, relativePath);

Результат \My\Relative\Folder вместо ожидаемого \\server\BaseFolder\My\Relative\Folder.

Почему это? Какой лучший способ объединить относительные пути, которые могут иметь или не иметь косой черты в них?

EDIT: Я знаю, что я могу просто манипулировать строкой на relativePath для обнаружения и удаления стартовой косой черты. Есть ли более безопасный способ сделать это (я думал, что Path.Combine должен был быть безопасным способом), который будет учитывать обратную косую черту и frontslashes?

4b9b3361

Ответ 1

Отбросьте ведущую косую черту на relativePath, и она должна работать.

Причина, по которой это происходит, заключается в том, что Path.Combine интерпретирует relativePath как корневой (абсолютный) путь, потому что в этом случае он начинается с \. Вы можете проверить, является ли путь относительным или корневым с помощью Path.IsRooted().

В doc:

Если один из последующих путей абсолютный путь, то комбинат сбрасывается с начала абсолютный путь, отбрасывая все предыдущие комбинированные пути.

Ответ 2

Пути, начинающиеся с косой черты, интерпретируются как абсолютные, а не относительные. Просто обрежьте косую черту, если хотите гарантировать, что relativePath путь будет рассматриваться как относительный.

var basePath = @"\\server\BaseFolder";
var relativePath = @"\My\Relative\Folder";

var combinedPath = Path.Combine(basePath, relativePath.TrimStart('/', '\\'));