Order some files by time before display

Hi everybody,

I have write a short script that display each article of a folder:

require ‘find’
result = []
@pattern = ‘*.html’
Find.find(‘public/2008/’) do |p|
next unless File.file?§
name = File.basename§
result << p if File.fnmatch(@pattern, name)
end
a = ‘’
result.length.times do |i|
content = File.read(result[i])
a += ‘


a += content
a += ‘’ + File.ctime(result[i]).to_s + ‘’
a += ‘

end
a

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.

Thanks,
Dendicus

Hi David,

David B. wrote:

require ‘find’
result = []
@pattern = ‘*.html’
Find.find(‘public/2008/’) do |p|
next unless File.file?§
name = File.basename§
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§ }

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

Many thanks, Matthias! Your answer was perfectly resolve my problem and
now the code is really more fashion!

Thanks again,
Dendicus