ruby - 如何在 ruby​​ 上导航两个目录

标签 ruby directory

在 Ruby 中,我有全局变量 $file_folder 给我当前配置文件的位置:

$file_folder = "#{File}"
$file_folder = /repos/.../test-folder/features/support

我需要访问位于不同文件夹中的文件,而这个文件夹在上两层和下两层。有什么方法可以使用当前位置导航到此目标路径吗?

target path = /repos/..../test-folder/lib/resources

最佳答案

有两种方法可以做到这一点(好吧,有几种方法,但这里有两种很好的方法)。首先,使用 File.expand_path:

original_path = "/repos/something/test-folder/features/support"
target_path = File.expand_path("../../lib/resources", original_path)

p target_path
# => "/repos/something/test-folder/lib/resources"

请注意 File.expand_path总是会返回一个绝对路径,所以如果你想返回一个相对路径是不合适的。如果您使用它,请确保第二个参数是绝对路径,或者,如果它是相对路径,您知道它将扩展到什么(这将取决于当前的工作目录)。

接下来,使用 Pathname#join(别名为 Pathname#+):

require "pathname"

original_path = Pathname("/repos/something/test-folder/features/support")
target_path = original_path + "../../lib/resources"

p target_path
# => #<Pathname:/repos/something/test-folder/lib/resources>

你也可以使用Pathname#parent,但我觉得有点丑:

p original_path.parent.parent
# => #<Pathname:/repos/something/test-folder>

p original_path.parent.parent + "lib/resources"
# => #<Pathname:/repos/something/test-folder/lib/resources>

我更喜欢路径名,因为它使处理路径变得非常容易。通常,您可以将 Pathname 对象传递给采用路径的任何方法,但偶尔会有一个方法对字符串以外的任何其他内容犹豫不决,在这种情况下,您需要先将其转换为字符串:

p target_path.to_s
# => "/repos/something/test-folder/lib/resources"

附言foo = "#{bar}" 是 Ruby 中的反模式。如果 bar 已经是一个字符串,您应该直接使用它,即 foo = bar。如果 bar 还不是一个字符串(或者您不确定),您应该使用 to_s 显式转换它,即 foo = bar.to_s

附言全局变量是 Ruby 中令人讨厌的代码味道。几乎总有比使用全局变量更好的方法。

关于ruby - 如何在 ruby​​ 上导航两个目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24614566/

相关文章:

python - 通过python访问放置在多个目录中的文件

ruby - 努力理解数组

javascript - Ruby on Rails/HTML 表

Ruby 代码查找特定文件并重命名它,不起作用?

linux - 从 .git 文件夹恢复存储库

ruby - 获取目录中的文件夹列表

windows - 在删除批处理文件中的每个文件之前创建备份

ruby - SSLv3 读取服务器证书 B:证书验证失败(Twitter::Error)

ruby - Net::SSH::Multi 使用 session.exec,如何立即获得输出? ruby

regex - 如何使用 htaccess 重写从 url 中删除此目录/文件夹?