我是Ruby新手(作爲Java開發人員)並試圖實現一種方法(哦,對不起,一個函數),它將遞歸檢索併產生子目錄中的所有文件。Ruby中的遞歸文件列表
我實現它:
def file_list_recurse(dir)
Dir.foreach(dir) do |f|
next if f == '.' or f == '..'
f = dir + '/' + f
if File.directory? f
file_list_recurse(File.absolute_path f) { |x| yield x }
else
file = File.new(f)
yield file
end
end
end
我的問題是:
- 不File.new真正打開一個文件?在Java新的文件(「xxx」)不......如果我需要產生一些結構,我可以查詢文件信息(ctime,大小等)從它將在Ruby中會是什麼?
- {| x | yield x}對我來說看起來有點奇怪,是否可以通過類似遞歸函數來產生收益,還是有一些方法可以避免它?
- 有沒有辦法避免檢查'。'和'..'在每次迭代?
- 有沒有更好的方法來實現這個?
感謝
PS: 我的方法的示例用法是這樣的:
curr_file = nil
file_list_recurse('.') do |file|
curr_file = file if curr_file == nil or curr_file.ctime > file.ctime
end
puts curr_file.to_path + ' ' + curr_file.ctime.to_s
(這將讓你從樹上最早的文件)
= =========
所以,感謝@buruza埃蒙我發現了偉大的Dir.glob函數,它爲我節省了幾行代碼。 此外,由於@Casper我發現了File.stat方法,這使我的功能運行比File.new
快兩倍到底我的代碼看起來像這樣:
i=0
curr_file = nil
Dir.glob('**/*', File::FNM_DOTMATCH) do |f|
file = File.stat(f)
next unless file.file?
i += 1
curr_file = [f, file] if curr_file == nil or curr_file[1].ctime > file.ctime
end
puts curr_file[0] + ' ' + curr_file[1].ctime.to_s
puts "total files #{i}"
=====
默認Dir.glob忽略文件名開頭的一個點(認爲* nix中被「隱藏」),所以要加第二個參數文件是非常重要:: FNM_DOTMATCH
這是偉大的!但它會產生一個String對象數組。我在尋找的是一個函數,它會產生一個類似於文件的結構,以便我可以根據它進行自己的計算。找到最大的文件,最早的ctime等。 –
Dir ['。']不接受一個塊。但是Dir.glob呢!它回答我的問題,除了#1問題 –