Поскольку .NET не включает API для создания относительных путей, вместо этого я использовал метод Uri MakeRelativeUri
. Это работает, но я столкнулся с несколькими случаями, когда это не происходит из-за того, что Uri экранирован. Так что я исправил и это:
public static string MakeRelativePath(string basePath, string tgtPath) {
return
Uri.UnescapeDataString(
new Uri(basePath, UriKind.Absolute)
.MakeRelativeUri(new Uri(tgtPath, UriKind.Absolute))
.ToString()
).Replace('/', Path.DirectorySeparatorChar);
}
Эта версия, похоже, работает, но вызывает у меня некоторое недоумение: нет ли каких-либо действительных путей в локальной файловой системе, которые может повредить это необоснованное удаление?
Связано: Как получить относительный путь из абсолютного path Ответы на этот вопрос вообще не касаются проблемы необычных символов и экранирования и, как таковые, не отвечают на этот вопрос.
PathRelativePathTo()
- person David Heffernan   schedule 05.06.2011PathRelativePathTo
не затрагивает файловую систему, насколько мне известно. Он основан исключительно на тексте. Если вы хотите узнать, как это реализовано, вы всегда можете посмотреть исходный код Wine! - person David Heffernan   schedule 05.06.2011