2012-02-19 1 views
5

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

+0

Связанный: http://stackoverflow.com/questions/3632074/what-is-the -fastest-way-to-calculate-disk-usage-for-customer – coreyward

+1

Связанный: http://stackoverflow.com/questions/4508692/get-available-diskspace-in-ruby – coreyward

ответ

1

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

+2

Возможно, это связано с тем, что прошло много времени с тех пор этот ответ, но мено ned gem правильно определяет размер блока (а также размер в байтах, ср. 'bytes_ {used, total, free}' только на уровне файловой системы (= mount) и, похоже, не работает для определения размера каталога. – oliverguenther

-1

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

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

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

+2

Я предполагаю, что вы были ниспадаете, потому что это возвращает размер каталога, но не комбинированный размер содержимого каталога. – d11wtq

+0

Ах, конечно, конечно. Это неутешительное предостережение. – fullsailor

-2

Инструменты поддержки:

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 ...

Sysinternals Suite

+0

Непонятно, как это решает проблему. Вам нужно будет объяснить –

2

Могли бы что-то нравится эта работа для вас?

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

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

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

Я думаю, что вы на самом деле просто получаете длину строки с '(&: size)' там. Вместо этого вы хотите: '{| file | File.size (файл)} '. –

+0

@ RyanLue Вы правы, я исправил свой ответ. – yegor256

 Смежные вопросы

  • Нет связанных вопросов^_^