[編集]さて、少し熟考した後、私は別の方法を思いつきましたが、それはすべての人にとって口に合うとは限りません。
void Main()
{
var path1 = @"C:\Program Files\Internet Explorer\";
var path2 = @"C:\temp\";
var sb = new StringBuilder(1000);
PathRelativePathTo(sb, path1, 0, path2, 0);
sb.ToString().Dump();
}
/*
BOOL PathRelativePathTo(
_Out_ LPTSTR pszPath,
_In_ LPCTSTR pszFrom,
_In_ DWORD dwAttrFrom,
_In_ LPCTSTR pszTo,
_In_ DWORD dwAttrTo
);
*/
[DllImport("Shlwapi.dll")]
[return:MarshalAs(UnmanagedType.Bool)]
public static extern bool PathRelativePathTo(
[Out] StringBuilder result,
[In] string pathFrom,
[In] int dwAttrFrom,
[In] string pathTo,
[In] int dwAttrTo);
ああ、ちょうどアイデアがありました-これはあなたに(多かれ少なかれ)あなたが必要とするものを手に入れますか?
public string PathDiff(string path1, string path2)
{
var replace1 = path1.Replace(path2, string.Empty);
var replace2 = path2.Replace(path1, string.Empty);
return Path.IsPathRooted(replace1) ? replace2 : replace1;
}
またはおそらくより良い:
public string PathDiff(string path1, string path2)
{
return path1.Length > path2.Length ?
path1.Replace(path2, string.Empty) :
path2.Replace(path1, string.Empty);
}
(編集:derp、送信を早すぎます):
残念ながら、組み込みの相対パスヘルパーはありませんが、基本的には、次のように、持っているものでそれを手に入れることができます。
var path1 = @"C:\dev\src\release\Frontend\";
var path2 = @"C:\dev\src\";
var path1Uri = new Uri(path1);
var path2Uri = new Uri(path2);
var from1to2 = path1Uri.MakeRelativeUri(path2Uri).OriginalString;
var from2to1 = path2Uri.MakeRelativeUri(path1Uri).OriginalString;
Console.WriteLine("To go from {0} to {1}, you need to {2}", path1, path2, from1to2);
Console.WriteLine("To go from {0} to {1}, you need to {2}", path2, path1, from2to1);
出力:
To go from C:\dev\src\release\Frontend\ to C:\dev\src\, you need to ../../
To go from C:\dev\src\ to C:\dev\src\release\Frontend\, you need to release/Frontend/
ここで、スラッシュの違い「\」と「/」については、最終結果をでラップPath.GetFullPath
すると、違いが自動解決されます。
Console.WriteLine(Path.GetFullPath(Path.Combine(path1, from1to2)));
Console.WriteLine(Path.GetFullPath(Path.Combine(path2, from2to1)));
出力:
C:\dev\src\
C:\dev\src\release\Frontend\