Sono nuovo di Ruby (essendo uno sviluppatore Java) e sto cercando di implementare un metodo (oh, mi dispiace, una funzione) che recupera e restituisce tutti i file nelle sottodirectory in modo ricorsivo.elenco di file ricorsivo in Ruby
Ho implementato come:
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
Le mie domande sono:
- fa File.new davvero aprire un file? In Java nuovo File ("xxx") non ... Se ho bisogno di fornire qualche struttura che potrei interrogare informazioni sui file (ctime, dimensione, ecc) da cosa sarebbe in Ruby?
- {| x | yield x} mi sembra un po 'strano, è OK fare rendimenti da funzioni ricorsive del genere, o c'è un modo per evitarlo?
- C'è un modo per evitare il controllo di '.' e '..' su ogni iterazione?
- C'è un modo migliore per implementare questo?
Grazie
PS: l'uso del campione del mio metodo è qualcosa di simile:
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
(che sarebbe ottenere il file più vecchio dall'albero)
= =========
Quindi, grazie a @buruza Emon ho scoperto la grande funzione di Dir.glob che mi ha salvato un paio di righe di codice. Inoltre, grazie a @Casper ho scoperto il metodo File.stat, che ha reso la mia funzione corsa due volte più veloce che con File.new
Alla fine il mio codice sta cercando qualcosa di simile:
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}"
=====
per impostazione predefinita Dir.glob ignora i nomi di file che iniziano con un punto (considerato da 'nascosto' in * nix), quindi è molto importante aggiungere il secondo file argomento :: FNM_DOTMATCH
che è grande!Ma produce un array di oggetti String. Quello che sto cercando è una funzione che produrrebbe una struttura simile a File in modo che potessi fare i miei calcoli basati su quello. Trovare il file più grande, il primo ctime ecc. –
Dir ['.'] Non accetta un blocco. Ma Dir.glob lo fa! Risponde alle mie domande, ad eccezione della domanda n. –