Почему 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,

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

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

3 ответа

Решение

Бросить косую черту relativePath и это должно работать.

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

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

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

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

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

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

Согласно этому документу на Path.Combine в примечании говорится, что лучше всего использовать Path.Join()для этого сценария, когда пользователь мог ввести значения. Похоже, он был представлен в .NET Core 3.0

      Path.Join(basePath, relativePath);

Похоже, единственное отличие состоит в этом явном сценарии, в котором мы не хотим рассматривать какой-либо из комбинируемых путей как потенциальные корневые пути.

В отличие от метода Combine, метод Join не пытается укоренить возвращенный путь. (То есть, если path2, path2 или path3 является абсолютным путем, метод Join не отбрасывает предыдущие пути, как это делает метод Combine.

Другие вопросы по тегам