2012-02-19 35 views
5

Có đá quý tốt để nhận kích thước thư mục được tính toán đệ quy không? Trong unix, tôi có thể sử dụng du, nhưng tôi muốn một thư viện hấp thụ sự khác biệt giữa các hệ điều hành.Đệ quy nhận kích thước của một thư mục

+0

liên quan: http://stackoverflow.com/questions/3632074/what-is-the -fastest-way-to-calcul-disk-usage-per-customer – coreyward

+1

Liên quan: http://stackoverflow.com/questions/4508692/get-available-diskspace-in-ruby – coreyward

Trả lời

1

Dường như sys-filesystem xử lý việc này, nhưng bạn sẽ cần thực hiện một số phép tính để chuyển đổi các khối khả dụng thành byte (bằng cách nhân với kích thước khối).

+2

Điều này có thể là do thời gian dài trôi qua kể từ câu trả lời này, nhưng tâm lý đá quý ned xác định chính xác kích thước khối (và cũng có kích thước tính theo byte, cf. 'bytes_ {used, total, free}' chỉ trên một hệ thống tập tin (= mount) và dường như không hoạt động để xác định kích thước của một thư mục. – oliverguenther

-1

Kiểm tra lớp File::Stat (lưu ý rằng nó không tính kích thước của nội dung thư mục, cần phải thực hiện thủ công).

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

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

+2

Tôi cho rằng bạn đã được downvoted vì điều này trả về kích thước của thư mục, nhưng không phải là kích thước kết hợp của nội dung của thư mục. – d11wtq

+0

Ah, nhưng tất nhiên. Đó là một cảnh báo đáng thất vọng. – fullsailor

-2

công cụ hỗ trợ:

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

Microsoft ... Hệ thống cài đặt CD

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

Sysinternals Suite tiện ích:

du.exe -l 1 %windir% 

Microsoft ...

Sysinternals Suite

+0

Không rõ cách giải quyết vấn đề này. YOu sẽ cần giải thích –

2

Có thể một cái gì đó giống như tác phẩm này với bạn?

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

Điều này dường như làm việc:

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

Tôi nghĩ bạn thực sự chỉ nhận được độ dài của chuỗi với '(&: size)' ở đó. Những gì bạn muốn thay vào đó là '{| file | File.size (file)} '. –

+0

@RyanLue Bạn nói đúng, tôi đã trả lời câu trả lời của mình. – yegor256

Các vấn đề liên quan