From: Matthias Reitinger Date: 2008-08-29T01:21:09+09:00 Subject: Re: Order some files by time before display Hi David, David B. wrote: > require 'find' > result = [] > @pattern = '*.html' > Find.find('public/2008/') do |p| > next unless File.file?(p) > name = File.basename(p) > result << p if File.fnmatch(@pattern, name) > end No need for 'find'. A simple 'glob' suffices: files = Dir[File.join('public/2008/', '**', @pattern)] David B. wrote: > a = '' > result.length.times do |i| > content = File.read(result[i]) > a += '
' > a += content > a += '
' + File.ctime(result[i]).to_s + '
' > a += '
' > end > a Iterating over an array like this is kind of cumbersome. 'each' should be your weapon of choice here. Furthermore using the << operator for concatenation could yield in better performance as += constructs a new String object whereas << doesn't (AFAIK). David B. wrote: > As you can see, it display some articles in a webpage. However, but I > would like to order them by time (with File.ctime(result[i]) for > instance) such as in blogs. If you see a sexy way to do so, that would > be very helpful for me. Hope that's sexy enough for you: result = result.sort_by { |p| File.ctime(p) } To sum it all up here is how I would have done it: --- @dir = 'public/2008' @pattern = '*.html' files = Dir[File.join(@dir, '**', @pattern)].select { |f| File.file?(f) } files = files.sort_by { |f| File.ctime(f) } a = '' files.each do |f| a << '
' a << File.read(f) a << '
' + File.ctime(f).to_s + '
' a << '
' end a --- Hope that helps! Regards, Matthias -- Posted via http://www.ruby-forum.com/.