Hatena::Grouprubyist

てーげーRuby

2008-08-21

練習問題 ファイルとディレクトリ

| 14:43

# (1) $:には、Rubyが利用できるライブラリが置かれているディレクトリの

# 名前が、配列の形で格納されています。この変数を使って、Rubyが利用できる

# ライブラリのファイル名を、順に出力するメソッドprint_librariesメソッドを

# 定義してください。

print_libraries.rb

def traverse(dirname)
  Dir.entries(dirname).reject{|d| d =~ /^\.+$/}.each{|e|
    if File.directory?(dirname + '/' + e)
      traverse(dirname + '/' + e)
    else
      puts e
    end
  }
  return nil
end

def print_libraries
  $:.reject{|d| d =~ /^\.+$/}.each{|e| traverse(e)}
  return nil
end

if __FILE__ == $0
  print_libraries
end

# (2) Unixコマンドのduコマンドのように、ファイルとディレクトリに保存

# されているデータの大きさを再帰的に掘り下げて表示するメソッドduを定義

# してください。

# このメソッドは引数を1つだけ取ります。

# du(調べるディレクトリ名)

def du(dirname, sum=0)
  entries = Dir.entries(dirname).reject{|d| d =~ /^\.+$/}

  entries.each{|e|
    if File.directory?(dirname  + '/' + e)
      sum += du(dirname + '/' + e) 
    else
      #printf("%10d %s\n", (File.stat(dirname + '/' + e).size)/1024, dirname + '/' + e)
      sum += File.stat(dirname + '/' + e).size
    end
  }
  sum += File.stat(dirname).size
  printf("%10d %s\n", sum/1024, dirname)
  return sum
end

Unixコマンドのduコマンドとデータの大きさが合わない・・

rochefortrochefort2008/10/26 10:42linuxのduはブロック単位だからでしょうかねー