我需要打开目录中的每个文件。我的尝试看起来像:
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
应该是什么。
答案 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.glob
或File.find
。但不是Dir.foreach
,因为它会返回您不想要的.
和..
。
Dir.glob('something/*').each do |filename|
next if File.directory?(filename)
do_something_with_the_file(filename)
end