我需要一个递归函数来列出文件夹中的文件:
def procdir(dirname)
data = ''
Dir.foreach(dirname) do |dir|
dirpath = dirname + '/' + dir
if File.directory?(dirpath) then
if dir != '.' && dir != '..' then
#puts "DIRECTORY: #{dirpath}" ;
procdir(dirpath)
end
else
data += dirpath
end
end
return data
end
但结果:为空
答案 0 :(得分:16)
当你给它**
glob时,Stdlib Dir#glob
会递归。
def procdir(dir)
Dir[ File.join(dir, '**', '*') ].reject { |p| File.directory? p }
end
答案 1 :(得分:8)
使用find
模块:
require 'find'
pathes = []
Find.find('.') do |path|
pathes << path unless FileTest.directory?(path)
end
puts pathes.inspect
答案 2 :(得分:4)
旧线程,但也许某人可能觉得它很有用:
array_of_all_files = Dir
.glob("**/*")
.reject { |file_path| File.directory? file_path }
答案 3 :(得分:0)
看起来递归存在一些问题:
else
子句似乎与错误的if
相关联。它需要与第一个if
。procdir
来电的结果应添加到data
。如果你更简洁地缩进代码,那么发现这样的问题可能会更容易。以下包含两个修复:
def procdir(dirname)
data = ''
Dir.foreach(dirname) do |dir|
dirpath = dirname + '/' + dir
if File.directory?(dirpath) then
if dir != '.' && dir != '..' then
#puts "DIRECTORY: #{dirpath}" ;
data += procdir(dirpath)
end
else
data += dirpath
end
end
return data
end
答案 4 :(得分:0)
如果你知道文件扩展名,你就可以使用它:
Dir[Rails.root.join('config/locales/**/*.{rb,yml}')]