获得两个文件之间相对路径的最佳/最简单/最快捷方式?

时间:2009-03-19 20:28:13

标签: scripting file directory

我正在重构一些C#代码,其中一部分是重做一些引用,因为我们正在完全重做文件夹结构。我想做的只是进入.csproj或.sln文件并修改路径。

然而,一些参考文献有像

这样的路径
"../../../../../../ThirdParty/SomeMicrosoftLibrary/bin/Debug/SomeMicrosoftLibrary.dll

由于我们已经移动了所有东西,我需要找到新的相对路径。但我绝对不想尝试这样做(弄清楚我需要投入多少斜线和时间段),因为它总是让人觉得有点受欢迎或缺少科学。

是否有一些简单的方法(实用程序,脚本,代码片段)来说“这里的文件A,这里是文件B,文件B相对于文件A的相对路径是什么?”

3 个答案:

答案 0 :(得分:8)

使用Ruby:

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

我很确定Python有类似的方法,但我没有它的方便。

答案 1 :(得分:2)

Generate a Relative Path

它是Java语言,但很容易转换为C#。

答案 2 :(得分:2)

我知道这已经过时了,但我一直在寻找答案,所以这里有一种方法可以做到这一点,以防万一将来可以帮助其他人

/// <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;
}