[editedit] 好,有點沉思之後,我沒有想出了一個替代方案,但它可能不是可口所有:
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\
你爲什麼在這裏使用Uri?從你的代碼看起來你正在試圖處理文件路徑。這不是Uri的焦點 - 它有任何支持的唯一原因是file:URI。它給你的價值是正確的 - 如果你在調試器中查看uri1和uri2,你會看到它們是file:/// C:/ my%20folder /和file:/// C:/所以正確相對URI確實是我的%20folder。想必你正在尋找一個相對的文件系統路徑?這在Uris的世界裏並不是一個真正的概念,所以它會變得笨拙。 –
@Igriffiths:我發現一個實現在網絡上的某處使用URI來完成路徑差異,直到現在,這似乎是一個相當乾淨的路徑。就代碼行數而言,我仍然認爲它比其他解決方案更好。 – Neolisk