たのしい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

なんじゃこらぁぁぁ!!!!!!!

RailsRubyを採用した理由がわかったような気がする。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] || ".")

ナルホド。