只今Ruby勉強中

プログラミングRuby―達人プログラマーガイド

うさぎさんと一緒にRubyの勉強をしているオレの記録。

間違ってる所とかいっぱいあると思いますけど、誰でもコメント出来るので気軽に教えて下さい。

普段は 鷹の島 って所で書いてます。

現在のハマリポイント - yield, succ?, Proc & 後で

2009-04-17 (Fri)

テンポラリファイルを開いて hogefuga してリネームするようなコード 18:26  テンポラリファイルを開いて hogefuga してリネームするようなコード - 只今Ruby勉強中 を含むブックマーク

こんなの書いたんですが。

name = "loveneweb.txt"

newfile = File.open(name + ".tmp", "w")
File.open(name).each do |line|
   newfile.puts line
end
newfile.close
File.rename(name + ".tmp", name)

Windows で動かなかった。

hoge.rb:8:in `rename': Permission denied - loveneweb.txt.tmp or loveneweb.txt (Errno::EACCES) from hoge.rb:8

ファイルをちゃんと閉じてないのが原因っぽい。ブロック終了時に close してみた。

name = "loveneweb.txt"

newfile = File.open(name + ".tmp", "w")
File.open(name).each do |line|
   newfile.puts line
end.close
newfile.close
File.rename(name + ".tmp", name)

動いた。けどなんかダサいよね…。ブロックを別にしてみた。

name = "loveneweb.txt"

newfile = File.open(name + ".tmp", "w")
File.open(name) do |f|
   f.each do |line|
      newfile.puts line
   end
end
newfile.close
File.rename(name + ".tmp", name)

動いた。

ブロックが終わったら自動でクローズされるって聞いていたのですが、最初の例、これは linux なんですが、ここの each do end はブロックにあてはまらないのでしょうか。ファイルシステムのお話に広がっちゃうんでしょうかね。難しい事は良く分からん。

wocotawocota2009/04/26 22:24こんにちわ。
ブロックが終わったら自動でクローズされるってのは少し間違いで,
正確には,File.openにブロックを渡してあげたときだけ,よきにはからってくれます。

トラックバック - http://rubyist.g.hatena.ne.jp/gaba/20090417