[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