Ruby File.absolute_path返回意外值

时间:2014-06-18 23:57:29

标签: ruby irb

我正在运行一个测试脚本,其中一个ruby脚本从一个'脚本中读取并执行其他ruby脚本。文件夹中。

Folder structure:
RubyInception
  |_main.rb
  |_scripts
     |_1.rb
     |_2.rb

测试文件路径如下:

irb(main):014:0> Dir.foreach('./scripts') {|x| puts File.absolute_path x}

得出以下结果:

C:/.../Desktop/RubyInception
C:/.../Desktop
C:/.../Desktop/RubyInception/1.rb
C:/.../Desktop/RubyInception/2.rb

为什么不显示:

C:/.../Desktop/RubyInception/scripts/1.rb

环境:
Windows 7教授x64
红宝石1.9.3p448

解:
什么对我有用:

Dir["./scripts/*.rb"].each {|x| puts File.absolute_path x }

2 个答案:

答案 0 :(得分:1)

来自Dir.foreach

的文档
  

对指定目录中的每个条目调用一次块, 将每个条目的文件名 作为参数传递给块。

致电时

Dir.foreach('./scripts')

它会为您的块生成以下序列

.
..
1.rb
2.rb

请注意,结果中不包含路径信息。然后在您的块中,您尝试解析每个文件名的绝对路径。由于文件名没有前缀的绝对路径,因此当前工作目录(CWDPWD)用于解析每个条目的绝对路径。当CWDRubyInception时,您会获得:

File.absolute_path('.')          => C:/.../Desktop/RubyInception
File.absolute_path('..')         => C:/.../Desktop
File.absolute_path('1.rb')       => C:/.../Desktop/RubyInception/1.rb
File.absolute_path('2.rb')       => C:/.../Desktop/RubyInception/2.rb

CWDscripts时,您会获得:

File.absolute_path('.')          => C:/.../Desktop/RubyInception/scripts
File.absolute_path('..')         => C:/.../Desktop/RubyInception
File.absolute_path('1.rb')       => C:/.../Desktop/RubyInception/scripts/1.rb
File.absolute_path('2.rb')       => C:/.../Desktop/RubyInception/scripts/2.rb

总之,当您使用任何编程语言的文件API时(有任何异常吗?),请记住相对路径从当前工作目录开始。

答案 1 :(得分:0)

有关说明,请参阅documentation

  

从当前工作目录引用相对路径   除非给出dir_string,否则将使用该进程,在这种情况下将使用它   作为起点。

所以你可以使用dir_string参数:

Dir.foreach('./scripts') {|x| puts File.absolute_path x, 'scripts'}

Dir.glob

Dir.glob('./scripts/*.rb') {|x| puts File.absolute_path x}