我正在运行一个测试脚本,其中一个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 }
答案 0 :(得分:1)
对指定目录中的每个条目调用一次块, 将每个条目的文件名 作为参数传递给块。
致电时
Dir.foreach('./scripts')
它会为您的块生成以下序列
.
..
1.rb
2.rb
请注意,结果中不包含路径信息。然后在您的块中,您尝试解析每个文件名的绝对路径。由于文件名没有前缀的绝对路径,因此当前工作目录(CWD
或PWD
)用于解析每个条目的绝对路径。当CWD
为RubyInception
时,您会获得:
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
当CWD
为scripts
时,您会获得:
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}