2013-03-19 72 views
3

我需要一個遞歸函數的文件夾中列出文件:Ruby的功能列表文件遞歸

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

你能告訴我文件系統嗎? 'dirname'裏面是否包含多個目錄? – 2013-03-19 15:06:09

+0

[單引用遞歸列表目錄在Ruby中可能的重複](http://stackoverflow.com/questions/2370702/one-liner-to-recursively-list-directories-in-ruby) – dbenhur 2013-03-19 15:14:24

回答

8

使用find模塊:

require 'find' 

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

puts pathes.inspect 
15

STDLIB Dir#glob遞交給0123Bglob時遞歸。

def procdir(dir) 
    Dir[ File.join(dir, '**', '*') ].reject { |p| File.directory? p } 
end 
+0

感謝您的回覆,我明白我的問題。 dbenhur,你的代碼太棒了! 這是我的代碼,如果它可以幫助某人 def procdir(dir) Dir [File.join(dir,'**','*')] .reject {| p | File.directory? p} end file = procdir('mypath') #puts file file.each do | filename | #puts名 測試= filename.scan(/ SomeRegex /)。壓扁 把測試 (..) 結束 謝謝大家 – indi 2013-03-19 15:16:47

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 
+0

感謝您的答覆,我明白了我的問題。 – indi 2013-03-19 15:17:20

4

舊線程,但也許有人會發現它有用:

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

+1

爲什麼你重複一個幾乎與我[八個月前發佈]相同的答案(http://stackoverflow.com/a/15503079/1074296)? ['Dir :: []'](http://ruby-doc.org/core-2.0/Dir.html#method-c-5B-5D)與'Dir.glob'相同。 'File.join('**','*')'是說''**/*「'更方便的方式。 – dbenhur 2013-12-27 05:55:28

+0

我很抱歉,我不知道它們是相同的。而且我覺得這更具可讀性(可能,因爲我用了很多次,並且從來不知道它的另一種表示)。 – 2013-12-27 11:49:07

+0

@dbenhur:只是好奇,爲什麼'File.join('**','*')'比**/*「'更具可移植性。據我所知,它可以在Linux/Windows/MacOs上運行。 – 2017-03-02 12:02:39

0

如果您知道文件擴展名,你將只有使用這樣的:

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