如何在C#中获取从一个路径到另一个路径的相对路径

Ber*_*amb 30 .net c#

我希望有一个内置的.NET方法来做到这一点,但我找不到它.

我知道有两条路径位于同一个根驱动器上,我希望能够获得从一个到另一个的相对路径.

string path1 = @"c:\dir1\dir2\";
string path2 = @"c:\dir1\dir3\file1.txt";
string relPath = MysteryFunctionThatShouldExist(path1, path2); 
// relPath == "..\dir3\file1.txt"
Run Code Online (Sandbox Code Playgroud)

这个功能存在吗?如果不是最好的实现方式是什么?

Mar*_*ell 59

Uri 作品:

Uri path1 = new Uri(@"c:\dir1\dir2\");
Uri path2 = new Uri(@"c:\dir1\dir3\file1.txt");
Uri diff = path1.MakeRelativeUri(path2);
string relPath = diff.OriginalString;
Run Code Online (Sandbox Code Playgroud)

  • Uri确实有效,但会切换到正斜杠,这很容易修复.谢谢! (3认同)
  • 不仅要注意正斜杠!最好添加 UnescapeDataString。string relPath = Uri.UnescapeDataString(diff.OriginalString); (2认同)

小智 13

您也可以导入该PathRelativePathTo函数并调用它.

例如:

using System.Runtime.InteropServices;

public static class Util
{
  [DllImport( "shlwapi.dll", EntryPoint = "PathRelativePathTo" )]
  protected static extern bool PathRelativePathTo( StringBuilder lpszDst,
      string from, UInt32 attrFrom,
      string to, UInt32 attrTo );

  public static string GetRelativePath( string from, string to )
  {
    StringBuilder builder = new StringBuilder( 1024 );
    bool result = PathRelativePathTo( builder, from, 0, to, 0 );
    return builder.ToString();
  }
}
Run Code Online (Sandbox Code Playgroud)