Feature #4592
Tempfileを直接保存したい
| Status: | Assigned | Start date: | 04/21/2011 | |
|---|---|---|---|---|
| Priority: | Normal | Due date: | ||
| Assignee: | % Done: | 0% |
||
| Category: | lib | |||
| Target version: | - |
Description
Tempfileは一時ファイルなので、プロセスが消えたり、#closeすると、 ファイルが消えてしまいます。 Tempfileのデータを保存するために 一旦読みだして、書き込み用に別ファイルを開いて、 そこに書きこまなければいけません。 これが小さいファイルだったらいいのですが、 大きいファイルになると、 Tempfile#save みたいなメソッドを用意して、 closeと同時に保存ができると、 読みだして書きこむという無駄をなくすことができます。 10MB程度だったらいいのですが、500MとかのTempfileだと かなり有効なメソッドだと思います。
History
Updated by sakuro (Sakuro OZAWA) about 1 year ago
#close(real=false)したあと、#path を使って、保存したいところに File#rename とか、File#link を使うとよいと思います。
Updated by sakuro (Sakuro OZAWA) about 1 year ago
先頭が # だと丸ごと見えなくなるのか…
#close(real=false)したあと、#path を使って、保存したいところに File#rename とか、File#link を使うとよいと思います。
Updated by mrkn (Kenta Murata) about 1 year ago
Tempfile#mv(path) というメソッドを追加するパッチを書いてみました。 https://gist.github.com/933915
File.rename してるので、元のファイルが無くなっちゃいますし、 元のファイルと同じファイル名のまま維持したい場合は使えなかったりします。
Updated by sakuro (Sakuro OZAWA) about 1 year ago
FileUtilsと間違えた。renameやlinkはFileのクラスメソッドでした。
Updated by shyouhei (Shyouhei Urabe) about 1 year ago
closeと同時というのを諦め、closeのちょっと後でよければ、普通にmvできるのではないでしょうか。
irb(main):001:0> f = Tempfile.new('') => #<File:/tmp/20110421-7098-1bvjwc0> 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"- /tmpとRubyのカレントディレクトリが別パーティションだったら、どのみちコピーは発生するのではないでしょうか。
- Tempfileを保存したいというのはTempfileの意味からして本末転倒なのではないでしょうか。
といった感想を抱きました。
Updated by xibbar (Takeyuki Fujioka) about 1 year ago
卜部さんの言うとおりなのですが、ユースケースを書きますと、 Railsもcgi.rbも巨大なファイルをアップロードしたときは tempfileにファイルを保存します。 これを保存したいとなったときに、 tempfileから読みだして、別ファイルをオープンして 書きこむという手間とメモリが必要なので、 tempfileに入っているんだから、そのままリネームでもして 保存出来ればいいのになと思ったのでした。
ちなみに卜部さんのやり方ももちろんOKですが、 私的にはHTTP Requestをまたいで使いたいので、 tempfileを消えないようにだけするという対応でも OKなのでした。tempfile名をセッションにでも入れて、 次のリクエストでまた開くということをやりたかったです。
Updated by mame (Yusuke Endoh) about 1 month ago
- Description updated (diff)
- Status changed from Open to Assigned
- Assignee set to mame (Yusuke Endoh)
Updated by akr (Akira Tanaka) about 1 month ago
Updated by ko1 (Koichi Sasada) about 1 month ago
Updated by mame (Yusuke Endoh) about 1 month ago
Updated by mame (Yusuke Endoh) about 1 month ago
- Assignee changed from mame (Yusuke Endoh) to matz (Yukihiro Matsumoto)