将绝对路径转换为相对路径

时间:2014-03-14 19:37:09

标签: ruby file path relative-path absolute-path

将相对路径foo相对于参考点bar转换为绝对路径baz可以通过以下方式完成:

baz = File.expand_path(foo, bar)

如何做到与此相反?换句话说,给定绝对路径baz和参考点bar(以绝对路径给出),如何将其转换为相对路径foo,如下所示?

foo = File.relative_path(baz, bar)

请假设所有给定路径都是规范化的,因为如果它们是目录,它们不会以/结尾:

"/foo/bar"
"/foo/bar/" # No need to consider

,这同样适用于所有返回的路径。

请注意,这并不像从bar的初始部分剥离baz并将其替换为./一样简单,因为baz不一定是bar的后代{1}}。一般来说,必须堆叠一些../以达到共同的祖先。

示例包括但不限于:

File.relative_path("/foo/bar/quex", "/foo") # => "bar/quex" (preferred) or
                                            #    "./bar/quex"
File.relative_path("/foo", "/foo/bar") # => "../"
File.relative_path("/foo/bar", "/baz/quex") # => "../../foo/bar"

1 个答案:

答案 0 :(得分:4)

我相信Pathname#relative_path_from正是您所寻找的。见this answer我给了另一个问题。

require 'pathname'

first = Pathname.new '/first/path'
second = Pathname.new '/second/path'

relative = second.relative_path_from first
# ../../second/path

first + relative
# /second/path