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

saw*_*awa 1 ruby file path relative-path absolute-path

可以通过以下方法将相foo对于参考点的相对路径bar转换为绝对路径baz

baz = File.expand_path(foo, bar)
Run Code Online (Sandbox Code Playgroud)

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

foo = File.relative_path(baz, bar)
Run Code Online (Sandbox Code Playgroud)

请假设所有给定的路径在没有/目录的情况下都经过规范化处理(如果它们是目录):

"/foo/bar"
"/foo/bar/" # No need to consider
Run Code Online (Sandbox Code Playgroud)

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

请注意,这并不像bar从的开头部分剥离baz并替换为那样简单,./因为baz它不一定是的后代bar。通常,../必须堆叠多个才能到达共同祖先。

示例包括但不限于:

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"
Run Code Online (Sandbox Code Playgroud)

Mat*_*ira 6

我相信Pathname#relative_path_from这就是您要寻找的。看到我给另一个问题的答案

require 'pathname'

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

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

first + relative
# /second/path
Run Code Online (Sandbox Code Playgroud)