我正在重构一些C#代码,其中一部分是重做一些引用,因为我们正在完全重做文件夹结构。我想做的只是进入.csproj或.sln文件并修改路径。
然而,一些参考文献有像
这样的路径"../../../../../../ThirdParty/SomeMicrosoftLibrary/bin/Debug/SomeMicrosoftLibrary.dll
由于我们已经移动了所有东西,我需要找到新的相对路径。但我绝对不想尝试这样做(弄清楚我需要投入多少斜线和时间段),因为它总是让人觉得有点受欢迎或缺少科学。
是否有一些简单的方法(实用程序,脚本,代码片段)来说“这里的文件A,这里是文件B,文件B相对于文件A的相对路径是什么?”
答案 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)
它是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;
}