Будет ли работать этот метод создания относительных путей? - PullRequest
3 голосов
/ 05 июня 2011

Поскольку .NET не включает API для создания относительных путей, вместо этого я использовал метод MakeRelativeUri Uri.Это работает, но я столкнулся с несколькими случаями, в которых это не так из-за того, что 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);
}

Эта версия , кажется, работает, но это заставляет меня чувствовать себя немного странно: нет ли действительных путей локальной файловой системы, что этобеспричинное эскейпинг может привести к повреждению?

Похожие: Как получить относительный путь по абсолютному пути Ответы на этот вопрос не касаются вопроса о необычных символах и вообще не имеют выходаи поэтому не отвечайте на этот вопрос.

1 Ответ

4 голосов
/ 05 июня 2011

Вместо экранирования, удаления и замены вы можете просто использовать базовый алгоритм, используемый System.Uri и методом PathDifference.Вот он, восстановленный через Reflector и модифицированный для немного лучшей читаемости.Он также был изменен для использования обратной косой черты для путей в стиле DOS вместо прямой косой черты для URI, и сравнение всегда нечувствительно к регистру.представляет каталог, он должен иметь обратную косую черту.Очевидно, что пути также должны быть ненулевыми.

Вот несколько примеров входов и выходов ... посмотрите, соответствует ли это вашим потребностям.

Path1                   Path2               Output
C:\test\path1\path2\    C:\test\            ..\..\
C:\test\path1\file      C:\test\            ..\
C:\test\path1\path2\    C:\                 ..\..\..\
C:\test\path1\path2\    D:\                 D:\
C:\test\path1\path2\    C:\test\path1\pathA ..\pathA
C:\test\                C:\test\    
C:\test\                C:\test\file        file
C:\test\file            C:\test\            .\
C:\test\path #1!\path2\ C:\test\            ..\..\
...