将相对于引用点 bar
的相对路径 foo
转换为绝对路径 baz
可以通过以下方式完成:
baz = File.expand_path(foo, bar)
如何做相反的事情?换句话说,给定一个绝对路径 baz
和引用点 bar
(给定为绝对路径),如何将其转换为相对路径 foo
如下所示?
foo = File.relative_path(baz, bar)
请假设所有给定的路径都是规范化的,因为如果它们是目录,它们不会以 /
结尾:
"/foo/bar"
"/foo/bar/" # No need to consider
这同样适用于所有返回的路径。
请注意,这并不像从 baz
的初始部分剥离 bar
并将其替换为 ./
那样简单,因为 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"
最佳答案
我相信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
关于ruby - 将绝对路径转换为相对路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22414257/