2012-02-19 27 views
5

Esiste una buona soluzione per calcolare le dimensioni delle directory calcolate in modo ricorsivo? In Unix, posso usare du, ma voglio una libreria che assorba la differenza tra il sistema operativo.Recuperare ricorsivamente le dimensioni di una directory

+0

correlati: http://stackoverflow.com/questions/3632074/what-is-the -fastest-way-to-calculate-disk-usage-per-customer – coreyward

+1

Correlati: http://stackoverflow.com/questions/4508692/get-available-diskspace-in-ruby – coreyward

risposta

1

Sembra che questo sia sys-filesystem, ma è necessario eseguire alcuni calcoli matematici per convertire i blocchi disponibili in byte (moltiplicando per dimensione blocco).

+2

Questo potrebbe essere dovuto al lungo tempo trascorso da questa risposta, ma il mentio ned gem determina correttamente la dimensione del blocco (e anche la dimensione in byte, cfr. 'bytes_ {used, total, free}' solo su un livello di file system (= mount) e non sembra funzionare per determinare la dimensione di una directory. – oliverguenther

-1

Verificare la classe File::Stat (notare che non calcola la dimensione del contenuto della directory, deve essere eseguita manualmente).

file = File::Stat.new('.') 
puts file.size 

http://ruby-doc.org/core-1.9.3/File/Stat.html#method-i-size

+2

Presumo che sia stato downvoted perché restituisce la dimensione della directory, ma non la dimensione combinata del contenuto della directory. – d11wtq

+0

Ah, ma ovviamente. Questo è un avvertimento deludente. – fullsailor

-2

Strumenti di supporto:

diruse /M %windir% 
diruse /K /S %windir% 
diruse /S %windir% 
diruse /, %windir% 

Microsoft ... sistema CD di installazione

msiexec /i %cd:~0,2%\SUPPORT\TOOLS\SUPTOOLS.MSI /q addlocal=all 

Sysinternals Suite Media:

du.exe -l 1 %windir% 

Microsoft ...

Sysinternals Suite

+0

Non è chiaro come questo risolva il problema. Dovrai spiegare –

2

Potrebbe qualcosa di simile a questo lavoro per voi?

def directory_size(path) 
    path << '/' unless path.end_with?('/') 

    raise RuntimeError, "#{path} is not a directory" unless File.directory?(path) 

    total_size = 0 
    Dir["#{path}**/*"].each do |f| 
    total_size += File.size(f) if File.file?(f) && File.size?(f) 
    end 
    total_size 
end 

puts directory_size '/etc' 
2

Questo sembra funzionare:

Dir.glob(File.join(dir, '**', '*')) 
    .map{ |f| File.size(f) } 
    .inject(:+) 
+0

Penso che in realtà stai solo prendendo la lunghezza della stringa con '(&: size)'. Quello che vuoi invece è '{| file | File.size (file)} '. –

+0

@RyanLue Hai ragione, ho risolto la mia risposta. – yegor256

Problemi correlati