读取目录w / Ruby中的其他文件

时间:2014-02-20 08:46:59

标签: ruby path

我的项目结构如下:

  • info.config(只是一个带有prefs + creds的JSON文件)
  • main.rb的
  • 任务/
    • test.rb

在main.rb(项目的根目录)和test.rb(在tasks文件夹下),我希望能够读取和解析info.config文件。我已经想出如何在main.rb中执行以下操作:

JSON.parse(File.read('info.config'))

当然,这在test.rb中不起作用。

问题:我怎样才能从test.rb中读取文件,即使它在层次结构中更深层次?

感谢我能得到的任何指导!谢谢!

3 个答案:

答案 0 :(得分:7)

使用相对路径:

path = File.join(
    File.dirname(File.dirname(File.absolute_path(__FILE__))),
    'info.config'
)
JSON.parse(File.read(path))
  • File.dirname(File.absolute_path(__FILE__))会为您提供test.rb所在的目录。 - > (1)
  • File.dirname(File.dirname(File.absolute_path(__FILE__)))将为您提供(1)。
  • 的父目录

参考:File::absolute_pathFile::dirname

<强>更新

使用File::expand_path更具可读性。

path = File.expand_path('../../info.config', __FILE__)
JSON.parse(File.read(path))

答案 1 :(得分:2)

我通常做的是:

在项目根目录中创建名为environment或类似名称的文件。此文件只有一个目的 - 扩展加载路径:

require 'pathname'
ROOT_PATH = Pathname.new(File.dirname(__FILE__))
$:.unshift ROOT_PATH

在代码开头需要此文件。从现在开始,每次调用require时,都可以将relative_path用于根目录,而不必担心需要它的文件位于何处。

使用File时,您可以轻松完成:

File.open(ROOT_PATH.join 'task', 'test.rb')

答案 2 :(得分:1)

您可以使用File::expand_path执行以下操作:

path = File.expand_path("info.config","#{File.dirname(__FILE__)}/..") 
JSON.parse(File.read(path))
  • File.dirname(__FILE__)会为您提供"root_path_of_your_projet/tasks/"的路径。

  • "#{File.dirname(__FILE__)}/.."会为您提供"root_path_of_your_projet/"的路径。 ..表示从当前目录向上一级。

  • File.expand_path("info.config","root_path_of_your_projet/")会以"root_path_of_your_projet/info.config"为您提供文件的实际路径。

您也可以使用__dir__代替File.dirname(__FILE__)

__dir__返回调用此方法的文件目录的规范化绝对路径。

希望解释有所帮助。