Почему 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?
Ответы
Ответ 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('/', '\\'));