2009-04-17 (Fri)
■ テンポラリファイルを開いて hogefuga してリネームするようなコード 
こんなの書いたんですが。
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 はブロックにあてはまらないのでしょうか。ファイルシステムのお話に広がっちゃうんでしょうかね。難しい事は良く分からん。
トラックバック - http://rubyist.g.hatena.ne.jp/gaba/20090417
ブロックが終わったら自動でクローズされるってのは少し間違いで,
正確には,File.openにブロックを渡してあげたときだけ,よきにはからってくれます。