たのしいRuby 第16章 FileクラスとIOクラス
昨日の事
昨日、本屋でRailsの本を立読みしたらびびった。
% irb -r rubygems -r active_support irb(main):001:0> p 1.minute 60 => nil irb(main):002:0> p 1.hour 3600 => nil
なんじゃこらぁぁぁ!!!!!!!
RailsがRubyを採用した理由がわかったような気がする。Rubyでなければ出来ない。
Railsをやりたいけど、基本重要。今日は第16章、Fileクラスと、IOクラスに突入する。
ディレクトリのトラバース
再帰を使ったディレクトリのトラバースが面白かったので、treeコマンドに改造してみた。
#!/usr/bin/ruby def tree(path, del) if FileTest.directory?(path) puts del + "|--" + path.sub(/.*\//, '') dir = Dir.open(path) while name = dir.read next if name == "." next if name == ".." tree(path + "/" + name, del + "| ") end dir.close elsif FileTest.file?(path) puts del + "|--" + path.sub(/.*\//, '') else puts "not found." end end if ARGV.empty? tree(".", "") else tree(ARGV[0], "") end
実行結果は・・・
% ./tree.rb ../../ |-- | |--c | | |--normal | | | |--head | | | | |--head | | | | |--tags ..(略 | | | |--lex.yy.c | | | |--number.y
本物。
% tree ../../ ../../ |-- c | |-- ls | | |-- Makefile ..(略 | `-- wc.awk `-- zim `-- Home.txt
ソートもないし、最後のディレクトリ処理も甘い。しかも、一段深い。色々課題が残ってるなぁ・・・。
treeは案外難しい。
気になったので修正。
やはり、気になったので修正を加えた。
#!/usr/bin/ruby def tree(path,del) dirs = Array.new files = Array.new dir = Dir.open(path) dir.sort.each do |name| next if name == "." next if name == ".." newpath = path + "/" + name if FileTest.directory?(newpath) dirs.push(newpath) else files.push(newpath) end end dir.close files.sort.each_with_index do |file, i| if i == files.length - 1 puts del + "`--" + file.sub(/.*\//, '') else puts del + "|--" + file.sub(/.*\//, '') end end dirs.each_with_index do |name, i| if i == dirs.length - 1 puts del + "`--" + name.sub(/^.*\//, '') tree(name, del + " ") else puts del + "|--" + name.sub(/^.*\//, '') tree(name, del + "| ") end end end if ARGV.empty? path = "." else path = ARGV[0] end if FileTest.directory?(path) puts path tree(path,"") elsif put "not found." end
実行結果は・・・。
% ./tree.rb ../../ ../../ |--c | |--ls | | |--Makefile ...(略 | `--wc.awk `--zim |--.zim.cache |--.zim.history.cache `--Home.txt
tree -aしたときと、ほぼ同様の結果になった。まだまだ課題は残る。正規表現より、File.basenameを使った方がいい。
便利そうなメソッドいっぱい
ひとつひとつ確認した。Findクラスが便利!!Ruby版Bloxsumとか面白そう。
練習問題。
簡単だった。参考になったのは、コレ。
du(ARGV[0] || ".")
ナルホド。