ファイルとディレクトリのバイト数を一覧表示

たのしいRubyの練習問題第16章(2)をやってみた。
以下のスクリプトを実行すると、
指定したディレクトリ以下に含まれる
ディレクトリとファイルのバイト数が一覧で表示される。
Unixでいうduコマンド。

def du(path)
  size = 0

  if FileTest.directory?(path)
    Dir.open(path){|dir|
      dir.each{|name|
        next if /^\.{1,2}$/ =~ name 
        size += du(File.join(dir.path, name))
      }
    }
  else
    size = FileTest.size(path)
  end
  
  puts "#{path}: #{size}byte"
  size
end

topdir = ARGV[0] || "."
du(topdir)

Dir#eachから得られる値はパスではなくファイルやディレクトリの名前。
FileTest.directory?やFileTest.sizeの引数はパス。
Dir#eachから得られた名前をFileTest.directory?などで使うためには、
名前からパスに変換する必要がある。
これにはFile.join(dir.path, name)を用いた。


以下は「たのしいRuby 第2版」練習問題の解答例の解答例。

require "find"

def du(path)
  result = 0
  Find.find(path){|f|
    if File.file?(f)
      result += File.size(f)
    end
  }
  printf("%d %s\n", result, path)
  return result
end

du(ARGV[0] || ".")

ぶっちゃけこの解答例は16章(2)の問題の正しい解答ではない。
ファイルとディレクトリのバイト数を表示しなくちゃいけないのに、
この解答例はディレクトリのバイト数しか表示されない。