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