将相对路径 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
同样的原理也适用于所有返回路径。
请注意,这并不像简单地从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"