我是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问题 –