如何使用Ruby打开目录中的每个文件?

时间:2016-03-10 23:21:21

标签: ruby

我需要打开目录中的每个文件。我的尝试看起来像:

Dir.foreach('path/to/directory') do |filename|
  next if filename == '.' || filename == '..'
  puts "working on #{filename}"

  # this is where it crashes
  file = File.open(filename, 'r')

  #some code

  file.close

  # more code

end

我的代码一直在File.open(filename, 'r')崩溃。我不确定filename应该是什么。

3 个答案:

答案 0 :(得分:2)

当文件与Ruby文件本身不在同一目录中时,文件名应包含文件的路径:

path = 'path/to/directory'
Dir.foreach(path) do |filename|
  next if filename == '.' || filename == '..'

  puts "working on #{filename}"

  file = File.open("#{path}/#{filename}", 'r')

  #some code

  file.close

  # more code
end

答案 1 :(得分:2)

我建议使用Find.find

虽然我们可以使用Dir类中的各种方法,但它会在返回之前查找和检索文件列表,如果我们以递归方式搜索多个目录或者嵌入了大量文件,这可能会很昂贵。目录。

相反,Find.find将遍历目录,返回每个目录和文件。通过简单的检查,我们可以决定要继续处理哪个或者是否要跳过它。文档中有一个易于理解的示例:

  

Find模块支持自上而下遍历一组文件路径。

     

例如,要总计主目录下所有文件的大小,忽略“dot”目录中的任何内容(例如$ HOME / .ssh):

require 'find'

total_size = 0

Find.find(ENV["HOME"]) do |path|
  if FileTest.directory?(path)
    if File.basename(path)[0] == ?.
      Find.prune       # Don't look any further into this directory.
    else
      next
    end
  else
    total_size += FileTest.size(path)
  end
end

答案 2 :(得分:0)

我选择Dir.globFile.find。但不是Dir.foreach,因为它会返回您不想要的...

Dir.glob('something/*').each do |filename|
  next if File.directory?(filename)
  do_something_with_the_file(filename)
end