Ruby函数列表文件递归

时间:2013-03-19 14:54:02

标签: ruby file function

我需要一个递归函数来列出文件夹中的文件:

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

但结果:为空

5 个答案:

答案 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}')]