Рекурсивно получить размер каталога - PullRequest
7 голосов
/ 20 февраля 2012

Есть ли хороший камень для получения рекурсивно рассчитанных размеров каталогов?В Unix я могу использовать du, но я хочу библиотеку, которая поглощает разницу между ОС.

Ответы [ 6 ]

4 голосов
/ 15 марта 2017

Это похоже на работу:

Dir.glob(File.join(dir, '**', '*'))
  .map{ |f| File.size(f) }
  .inject(:+)
2 голосов
/ 15 января 2016

Вот мое решение, использующее http://ruby -doc.org / core-2.2.0 / File.html # method-c-size :

def directory_size(path)
  size=0
  Dir.glob(File.join(path, '**', '*')) { |file| size+=File.size(file) }
  size
end
2 голосов
/ 26 июня 2013

Может ли что-то подобное для вас работать?

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'
1 голос
/ 20 февраля 2012

Похоже, sys-filesystem справляется с этим, но вам нужно будет поработать над математикой, чтобы преобразовать доступные блоки в байты (умножив их на размер блока).

0 голосов
/ 31 декабря 2012

Средства поддержки:

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

Microsoft ... системный установочный компакт-диск

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

Sysinternals Suite Utilities:

du.exe -l 1 %windir%

Microsoft ...

Sysinternals Suite

0 голосов
/ 20 февраля 2012

Проверьте класс File::Stat (обратите внимание, что он не рассчитывает размер содержимого каталога, это необходимо сделать вручную).

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

http://ruby -doc.org / ядро-1.9.3 / Файл / Stat.html # метод-я-размер

...