6

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

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

但结果:为空

4

5 回答 5

21

Dir#glob当你给它**glob时, Stdlib 会递归。

def procdir(dir)
  Dir[ File.join(dir, '**', '*') ].reject { |p| File.directory? p }
end
于 2013-03-19T15:04:42.937 回答
8

使用find模块:

require 'find'

pathes = []
Find.find('.') do |path|
  pathes << path unless FileTest.directory?(path)
end

puts pathes.inspect
于 2013-03-19T14:56:54.937 回答
7

Old thread but perhaps someone might find it useful:

array_of_all_files = Dir .glob("**/*") .reject { |file_path| File.directory? file_path }

于 2013-11-05T05:24:59.923 回答
1

看起来递归有几个问题:

  • 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
于 2013-03-19T15:05:43.047 回答
0

如果您知道文件扩展名,则只需使用以下内容:

Dir[Rails.root.join('config/locales/**/*.{rb,yml}')]

于 2017-03-09T13:19:39.150 回答