Есть ли хороший камень для получения рекурсивно рассчитанных размеров каталога? В unix я могу использовать du
, но мне нужна библиотека, которая поглощает разницу между ОС.Рекурсивно получить размер каталога
ответ
Похож, что sys-filesystem обрабатывает это, но вам нужно будет сделать некоторую математику, чтобы преобразовать доступные блоки в байты (путем умножения на размер блока).
Возможно, это связано с тем, что прошло много времени с тех пор этот ответ, но мено ned gem правильно определяет размер блока (а также размер в байтах, ср. 'bytes_ {used, total, free}' только на уровне файловой системы (= mount) и, похоже, не работает для определения размера каталога. – oliverguenther
Проверьте класс File::Stat
(учтите, что он не вычисляет размер содержимого каталога, его необходимо выполнить вручную).
file = File::Stat.new('.')
puts file.size
Я предполагаю, что вы были ниспадаете, потому что это возвращает размер каталога, но не комбинированный размер содержимого каталога. – d11wtq
Ах, конечно, конечно. Это неутешительное предостережение. – fullsailor
Инструменты поддержки:
diruse /M %windir%
diruse /K /S %windir%
diruse /S %windir%
diruse /, %windir%
Microsoft ... система установки CD
msiexec /i %cd:~0,2%\SUPPORT\TOOLS\SUPTOOLS.MSI /q addlocal=all
Sysinternals Suite Утилиты:
du.exe -l 1 %windir%
Microsoft ...
Непонятно, как это решает проблему. Вам нужно будет объяснить –
Могли бы что-то нравится эта работа для вас?
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'
Вот мое решение с помощью 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
Это похоже на работу:
Dir.glob(File.join(dir, '**', '*'))
.map{ |f| File.size(f) }
.inject(:+)
Я думаю, что вы на самом деле просто получаете длину строки с '(&: size)' там. Вместо этого вы хотите: '{| file | File.size (файл)} '. –
@ RyanLue Вы правы, я исправил свой ответ. – yegor256
Связанный: http://stackoverflow.com/questions/3632074/what-is-the -fastest-way-to-calculate-disk-usage-for-customer – coreyward
Связанный: http://stackoverflow.com/questions/4508692/get-available-diskspace-in-ruby – coreyward