C# 中是不是存在一种方法来获取给定两个绝对路径输入的相对路径? [复制]

Posted

技术标签:

【中文标题】C# 中是不是存在一种方法来获取给定两个绝对路径输入的相对路径? [复制]【英文标题】:Does there exist a method in C# to get the relative path given two absolute path inputs? [duplicate]C# 中是否存在一种方法来获取给定两个绝对路径输入的相对路径? [复制] 【发布时间】:2011-05-03 17:02:45 【问题描述】:

在给定两个绝对路径输入的情况下,C# 中是否存在获取相对路径的方法?

也就是说我会有两个输入(以第一个文件夹为基础),例如

c:\temp1\adam\

c:\temp1\jamie\

那么输出将是

..\jamie\

【问题讨论】:

对于《流言终结者》的参考资料,我不太愿意为自己 +1。哦,那就继续吧! 【参考方案1】:

不确定是否有更好的方法,但这会起作用:

var file1 = @"c:\temp1\adam\";
var file2 = @"c:\temp1\jamie\";

var result = new Uri(file1)
    .MakeRelativeUri(new Uri(file2))
    .ToString()
    .Replace("/", "\\");

【讨论】:

【参考方案2】:

这很简单。步骤:

    删除字符串的共同开头 (c:\temp1\) 计算第一个路径的目录数(在您的情况下为 1) 将它们替换为 .. 添加第二条路径

【讨论】:

但你不知道常用前缀! (第 1 步) 找到两个字符串的公共前缀并不难。问题在于细节。 / 和 \ 都是路径分隔符,一些文件系统不区分大小写,其他文件系统区分大小写,路径可以包含 .或 .. 可能还有其他几个问题。另一方面,低估共同部分并不是什么大问题。 @Mitch Wheat 我认为这很明显 @CodeInChaos:我没说这很难。【参考方案3】:

更新:由于构造函数现在已过时,您可以使用:

Uri.UnescapeDataString(new Uri(file1).MakeRelativeUri(new Uri(file2)).ToString())
  .Replace("/", "\\");

旧版本:

Kirk Woll 的想法不错,但您需要通过告诉 Uri 不要逃避您的路径来确保您的路径不会被破坏(例如,空格被 %20 替换):

var result = new Uri(file1, true)
    .MakeRelativeUri(new Uri(file2, true))
    .ToString()
    .Replace("/", "\\");

【讨论】:

嗯,我认为这是一个很好的观点,但值得一提的是,该构造函数被认为已过时并且会生成编译器警告。在我的测试中,我对转义字符没有任何问题。我想知道为你转义了哪些角色? @Kirk Woll,我的名字中的空格有问题。 啊,呃,对不起,没有意识到你提到了这一点。感谢您的回复。

以上是关于C# 中是不是存在一种方法来获取给定两个绝对路径输入的相对路径? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C#如何用exists判断指定路径的文件是不是存在。求完整代码?

C#获取文件物理路径(绝对路径)

C#获取文件物理路径(绝对路径)

java中如何判断web工程中图片的绝对路径是不是存在

C# 获取当前,相对,绝对路径

C# ,asp.net 获取当前,相对,绝对路径