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

标签 ruby file path relative-path absolute-path

将相对于引用点 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/

相关文章:

Ruby:如何从文件中读取正则表达式,然后使用该正则表达式解析字符串?

python - 为什么一个文件对象刷新,而另一个不刷新?

javascript - 如果没有扩展名,node path.extname 返回空字符串

android - 如何将android添加到cordova平台?路径错误?

ruby - map-detect inplace without lazy map 然后检测

ruby - 验证值是否在特定范围内,例如1 <= 值 <=2

java - 使用接受文件的 Spring Controller 防止内存不足错误

php - 无法使用运行 MAMP/PHP 5.6.1/Mac OS X El Capitan 的 putenv() 修改 PATH

ruby-on-rails - 如何在 ruby​​/rails 中合并两个列表并删除重复项?

ruby-on-rails - 猴子修补 Rails gem 的安全和最佳方法