Почему Path.Combine производит этот результат с относительным путем? - PullRequest
30 голосов
/ 21 апреля 2011

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

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

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

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

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

РЕДАКТИРОВАТЬ: Я знаю, что я могу просто выполнять строковые манипуляции на lativePath для обнаружения и удаления начального слеша.Есть ли более безопасный способ сделать это (я думал, что Path.Combine должен был быть безопасным способом), который будет учитывать обратную и прямую дроби?

Ответы [ 2 ]

42 голосов
/ 21 апреля 2011

Удалите начальный слеш на relativePath, и он должен работать.

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

Из документа :

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

20 голосов
/ 21 апреля 2011

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

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

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