2012-02-19 28 views
5

¿Hay alguna joya para obtener tamaños de directorio calculados recursivamente? En Unix, puedo usar du, pero quiero una biblioteca que absorba la diferencia entre SO.Obtener recursivamente el tamaño de un directorio

+0

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

+1

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

Respuesta

1

Parece que sys-filesystem maneja esto, pero necesitará hacer algunos cálculos matemáticos para convertir los bloques disponibles en bytes (multiplicando por tamaño de bloque).

+2

Esto puede deberse al largo tiempo transcurrido desde esta respuesta, pero el mentio ned gema determina correctamente el tamaño del bloque (y también el tamaño en bytes, cf. 'bytes_ {used, total, free}' solo en un nivel de sistema de archivos (= mount) y no parece funcionar para determinar el tamaño de un directorio. – oliverguenther

-1

Consulte la clase File::Stat (tenga en cuenta que no calcula el tamaño del contenido del directorio, debe hacerse manualmente).

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

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

+2

Supongo que fue downvoted porque esto devuelve el tamaño del directorio, pero no el tamaño combinado de los contenidos del directorio. – d11wtq

+0

Ah, pero por supuesto. Esa es una advertencia decepcionante. – fullsailor

-2

herramientas de soporte:

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

Microsoft ... Sistema de CD de instalación

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

Sysinternals Suite Utilidades:

du.exe -l 1 %windir% 

Microsoft ...

Sysinternals Suite

+0

No está claro cómo esto resuelve el problema. Necesitarás explicar –

2

Podría algo así como este trabajo para usted?

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

Esto parece funcionar:

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

Creo que en realidad estás obteniendo la longitud de la cadena con '(&: size)' allí. Lo que quiere en su lugar es '{| archivo | File.size (file)} '. –

+0

@RyanLue Tienes razón, arreglé mi respuesta. – yegor256

Cuestiones relacionadas