将相对路径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"
答案 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