2012-02-19 12 views
5

再帰的に計算されたディレクトリサイズを取得するための良い宝石ですか? Unixでは、私はduを使うことができますが、OSの違いを吸収するライブラリが必要です。再帰的にディレクトリのサイズを取得

+0

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

+1

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

答えて

1

sys-filesystemのように見えますが、利用可能なブロックをバイトに変換するには(ブロックサイズを掛けて)計算する必要があります。

+2

これは長い時間が経過したためですこの答えは、しかし、mentio ned gemは、ブロックサイズを正確に決定します(また、バイト単位のサイズも参照してください)。 'bytes_ {used、total、free}'はファイルシステム(=マウント)レベルのみであり、ディレクトリのサイズを決定するようには動作しません。 – 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% 

マイクロソフト...システムがCD

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

のSysinternals Suiteのユーティリティをインストールします。

du.exe -l 1 %windir% 

マイクロソフト...

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(file)} 'となります。 –

+0

@RyanLueあなたは正しいです、私は私の答えを修正しました。 – yegor256

関連する問題