Scripting 获取两个文件之间相对路径的最佳/最简单/最快方法?

Scripting 获取两个文件之间相对路径的最佳/最简单/最快方法?,scripting,file,directory,Scripting,File,Directory,我正在重构一些C代码,其中一部分是重做一些引用,因为我们正在完全重做文件夹结构。我想做的是进入.csproj或.sln文件并修改路径 但是,有些引用具有如下路径 "../../../../../../ThirdParty/SomeMicrosoftLibrary/bin/Debug/SomeMicrosoftLibrary.dll 既然我们已经移动了所有东西,我需要找到新的相对路径。但我绝对不喜欢尝试这样做(弄清楚我需要投入多少删节和周期),因为它总是让人感觉像是命中或未命中的科学 是否有一些

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

但是,有些引用具有如下路径

"../../../../../../ThirdParty/SomeMicrosoftLibrary/bin/Debug/SomeMicrosoftLibrary.dll
既然我们已经移动了所有东西,我需要找到新的相对路径。但我绝对不喜欢尝试这样做(弄清楚我需要投入多少删节和周期),因为它总是让人感觉像是命中或未命中的科学

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

使用Ruby:

$ ruby -e "require 'pathname'; puts Pathname.new('foo/bar').relative_path_from(Pathname.new('baz/x/y/z')).to_s"
../../../../foo/bar
我很确定Python也有类似的方法,尽管我手头没有。


它是用Java编写的,但很容易翻译成C#。

我知道这很旧,但我一直在寻找答案,所以这里有一个方法可以做到这一点,以防将来它可能会帮助其他人

/// <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;
}
//
///查找B相对于A的相对路径
/// 
///您要从中导航的路径
///您要导航到的路径
/// 
静态字符串Get_PathB_wrt_PathA(字符串A、字符串B)
{
字符串结果=”;
如果(A==B)
返回结果;
var s=新字符[]{'\\'};
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;
对于(i=0;i对于(i=0;我不认为Python的标准库中有这样的方法,但是谷歌搜索找到了大量的例子。检查不是只有os.path.relpath(a,b)吗?如果可能的话,我会嫁给Ruby=)在尝试获取子字符串之前,是否应该进行检查以确保“result”后面有一个反斜杠?如果a和B是完全相同的路径,这将失败。我不写C#,但在其他语言中,它将生成一个异常,因为您尝试获取长度为-1的子字符串。此外,如果a和B相等,for循环将变成In元素。(子元素计数-1)=(0-1)=-1,它永远不会满足循环终止条件:i<-1。循环只会永远递增i。同样,对C不熟悉,所以可能有一些语言特性阻止了这一点。但在其他语言中,上面的模式需要一些安全检查。我添加了一个a==B的检查,因为如果我们我知道它们是相等的。但是如果它们相等,循环就不是无限的。对于循环,所有的循环都是正递增的,没有一个循环不终止的危险。另外,关于尾随的反斜杠,我将第二个循环中的条件改为