Hatena::Grouprubyist

krystal: プログラミング超初心者(文系)

2009-01-07 (Wed)たのしいRuby練習問題

P306 - FileクラスとDirクラスの練習問題

20:22

(1)

  • $:を使ってRubyが利用できるライブラリのファイル名を順に出力するメソッドprint_libraryメソッドを定義しよう
def print_library
  $:.each{|i|
    next if i == "."  #practiceという練習フォルダにいるから、"."をスキップしないと練習ファイル全部出てくる
    dir = Dir.open(i)
    dir.each{|name|
      if name =~ /\.rb$/
        puts name
      end
    }
    dir.close
  }
end
print_library

(2)

  • あるディレクトリに置かれているファイルとサブディレクトリを、そのサブディレクトリに入っているファイルやディレクトリごとコピーするメソッドdircopyを定義しよう。
  • このメソッドは2つの引数を取ります。 ----> dircopy(コピー元のディレクトリ名, コピー先のディレクトリ名)

つまずいてる。考え方はそんなに間違ってない気がするけど、うまく実装できてない。

ちゃんと動くようになったらまたアップする。

答えなどを参考にした。


require "ftools"

def dircopy(dir1, dir2)
  if FileTest.exist?(dir2)
    raise "Error : #{dir2} exists already."
  end
  
  Dir.open(dir1){|dir|
    Dir.mkdir(dir2)
    dir.each{|name|
      next if name == "."       
      next if name == ".."      
      path1 = File.join(dir1, name)
      path2 = File.join(dir2, name)
      st = File.lstat(path1)       #lstatを使うことでシンボリックリンクもコピーできるようになるらしい
      if st.file?
        File.copy(path1, path2)
      elsif st.directory?
        dircopy(path1, path2)
      elsif st.symlink?
        File.symlink(File.readlink(path1), path2)
      else
        $stderr.pus "unknown file type : #{path1}"
      end
    }
  }
end

dircopy("/rubima011-cgi", "/ruby/practice/temp")

「たのしいRuby」はちゃんと校正されたか疑問。かなりtypoがあったから。