【问题标题】:Ruby: How to get the correct full path of a source file after a chdir?Ruby:如何在 chdir 之后获取源文件的正确完整路径?
【发布时间】:2013-12-17 09:08:02
【问题描述】:

请看下面的例子:

puts __FILE__                           #test.rb
puts File.expand_path(__FILE__)         #C:/TEMP/test.rb

Dir.chdir('..')
puts __FILE__                           #test.rb
puts File.expand_path(__FILE__)         #C:/test.rb

在(全局)chdir 之后,expand_path 返回错误的结果。

我怎样才能得到正确的结果?

我尝试使用File.expand_path的第二个参数:

puts File.expand_path(__FILE__, 'temp') #C:/TEMP/test.rb
puts File.expand_path(__FILE__, 'c:/temp') #C:/TEMP/test.rb

但是要使用它,我必须知道__FILE__的路径。

命令require_relative 似乎忽略了所有chdir-actions。所以我有希望,有一种方法可以获取文件的“真实”目录。

备注:

  • 我知道block-version of Dir.chdir - 对于我的特定任务,我无法使用它。
  • 我的实际解决方案:我在更改目录之前存储完整路径(我也可以在更改目录之前存储Dir.pwd)。

【问题讨论】:

  • 不明白预期的输出是什么。你能帮忙吗?
  • @ArupRakshit 我寻找源文件的真实位置。在我的示例中,它位于 c:/temp。
  • 检查一下 - ruby-doc.org/core-2.0.0/File.html#method-c-realdirpath,如果有帮助的话。
  • 为什么不能在亲戚之前做呢?而且,你做了宝石吗?
  • 我的代码中没有使用 require_relative。但是当我试图解决我的问题时,我认识到,require_relative 对目录的更改没有问题。所以我认为可能有一个解决方案。

标签: ruby path chdir


【解决方案1】:

__FILE__ builtin 是 String 类的实例:

puts __FILE__.class 
# ⇒ String

这意味着你不应该期望它有任何巫术魔法。它存储相对路径,这个文件是在哪里加载的。

ruby C:\TEMP\test.rb        # ⇒ __FILE__ == 'C:\TEMP\test.rb'
cd C:\TEMP && ruby test.rb  # ⇒ __FILE__ == 'test.rb'

在 ruby​​ 2.0 中新增了内置 __dir__ introduced。它看起来像您正在寻找的东西,以防2.0-only 解决方案适合您。

【讨论】:

    猜你喜欢
    • 2011-12-21
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 2011-10-05
    • 2020-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多