Лучший / самый простой / быстрый способ получить относительный путь между двумя файлами? - PullRequest
3 голосов
/ 19 марта 2009

Я нахожусь в процессе некоторого рефакторинга некоторого кода C #, и часть этого состоит в том, чтобы повторить некоторые ссылки, потому что мы полностью переделываем структуру папок. Я хотел бы просто зайти в файл .csproj или .sln и изменить пути.

Однако у некоторых ссылок есть такие пути, как

"../../../../../../ThirdParty/SomeMicrosoftLibrary/bin/Debug/SomeMicrosoftLibrary.dll

И так как мы переместили все вокруг, мне нужно найти новый относительный путь. Но я совершенно ненавижу пытаться сделать это (выяснить, сколько слешей и периодов мне нужно вставить), потому что это всегда похоже на удар или промах по науке.

Есть ли какой-нибудь простой способ (утилита, скрипт, фрагмент кода) сказать "вот файл A, вот файл B, каков относительный путь файла B по отношению к файлу A?"

Ответы [ 3 ]

8 голосов
/ 19 марта 2009

с рубином:

$ ruby -e "require 'pathname'; puts Pathname.new('foo/bar').relative_path_from(Pathname.new('baz/x/y/z')).to_s"
../../../../foo/bar

Я почти уверен, что в Python есть похожий метод, хотя он мне не подходит.

2 голосов
/ 17 июля 2013

Я знаю, что это старо, но я искал ответ на этот вопрос, так что вот метод, который делает это, на случай, если это может помочь кому-то еще в будущем

/// <summary>
/// Finds the relative path of B with respect to A
/// </summary>
/// <param name="A">The path you're navigating from</param>
/// <param name="B">The path you're navigating to</param>
/// <returns></returns>
static string Get_PathB_wrt_PathA(string A, string B)
{
    string result = "";

    if (A == B)
        return result;

    var s = new char[] { '\\' };
    var subA = A.Split(s, StringSplitOptions.RemoveEmptyEntries).ToList();
    var subB = B.Split(s, StringSplitOptions.RemoveEmptyEntries).ToList();

    int L = subA.Count >= subB.Count ? subB.Count : subA.Count;
    int i = 0;

    for (i = 0; i < L; i++)
    {
        if (subA[0] == subB[0])
        {
            subA.RemoveAt(0);
            subB.RemoveAt(0);
        }
        else
            break;
    }

    for (i = 0; i <= subA.Count - 1; i++)
    {
        result += @"..\"; //this navigates to the preceding directory
    }

    for (i = 0; i < subB.Count; i++)
    {
        result += subB[i] + "\\";
    }

    result = result.Substring(0, result.Length - 1); //remove the extra backslash
    return result;
}
2 голосов
/ 19 марта 2009

Создать относительный путь

Это на Java, но легко переводится на C #.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...