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

しかし、結果: null

4

5 に答える 5

21

グロブを指定すると、 StdlibDir#globは再帰します**

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

コードをもう少しきれいにインデントすると、そのような問題を見つけやすくなります。以下に2つの修正が含まれています。

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 に答える