From: "mame (Yusuke Endoh)" Date: 2012-03-31T20:50:08+09:00 Subject: [ruby-dev:45477] [ruby-trunk - Feature #4592] Tempfileを直接保存したい Issue #4592 has been updated by mame (Yusuke Endoh). どういう意味でこのチケットを自分にアサインしたか忘れてしまったのですが。 shyouhei (Shyouhei Urabe) wrote: > * closeと同時というのを諦め、closeのちょっと後でよければ、普通にmvできるのではないでしょうか。 > irb(main):001:0> f = Tempfile.new('') > => # > irb(main):002:0> f.puts("foobar") > => nil > irb(main):003:0> f.close; File.rename(f, "tmp.txt") > => 0 > irb(main):008:0> File.read("tmp.txt") > => "foobar\n" これは、GC タイミングによっては失敗しますよね。(f.close の直後で GC) また、rename 後に元のファイル名と同じファイルを作ったら、この tempfile が GC される際に消されてしまう危険があると思います。 よって、workaround としては推奨しかねるものだと思います。 > * /tmpとRubyのカレントディレクトリが別パーティションだったら、どのみちコピーは発生するのではないでしょうか。 気にするなら、Tempfile 生成ディレクトリを自分で指定すればいいと思います。 > * Tempfileを保存したいというのはTempfileの意味からして本末転倒なのではないでしょうか。 これは個人の感覚の問題だと思いますが、「temporary だけど、うまく行けば 永続化するつもり」というのは私はいいかなあと思いました。 akr (Akira Tanaka) wrote: > remove_finalizer とか、save とかよりももうちょっと長い名前がいいんじゃないかなぁ、と思います。 Tempfile#persist とか、秋葉原の開発者会議で出た案でしたっけ。 -- Yusuke Endoh ---------------------------------------- Feature #4592: Tempfileを直接保存したい https://bugs.ruby-lang.org/issues/4592#change-25527 Author: xibbar (Takeyuki Fujioka) Status: Assigned Priority: Normal Assignee: mame (Yusuke Endoh) Category: lib Target version: =begin Tempfileは一時ファイルなので、プロセスが消えたり、#closeすると、 ファイルが消えてしまいます。 Tempfileのデータを保存するために 一旦読みだして、書き込み用に別ファイルを開いて、 そこに書きこまなければいけません。 これが小さいファイルだったらいいのですが、 大きいファイルになると、 Tempfile#save みたいなメソッドを用意して、 closeと同時に保存ができると、 読みだして書きこむという無駄をなくすことができます。 10MB程度だったらいいのですが、500MとかのTempfileだと かなり有効なメソッドだと思います。 #save とか #save! とか、何がいいかは議論の余地があると思います。 =end -- http://bugs.ruby-lang.org/