From: akr@... Date: 2015-11-19T16:38:35+00:00 Subject: [ruby-dev:49371] [Ruby trunk - Feature #11715] [Rejected] Tempfile.create unlinked file silently fails Issue #11715 has been updated by Akira Tanaka. Status changed from Open to Rejected /tmp のような複数のユーザが共有するディレクトリでは不確実な操作 (たとえば存在しないかもしれないファイルの削除) はしないほうがいいと思います。 ライブラリ側でファイルを消すのがエラーになって困るというのであれば、 ブロックを使わない形で Tempfile.create を呼び出してください。 そうすればファイルは消されないので、rename するなり消すなり、アプリケーション側で自由に行えます。 ---------------------------------------- Feature #11715: Tempfile.create unlinked file silently fails https://bugs.ruby-lang.org/issues/11715#change-54972 * Author: Yuki Kurihara * Status: Rejected * Priority: Normal * Assignee: ---------------------------------------- ファイルを作成してデータを書き込んでから読み込んで利用するプログラムにおいて、 全て書き込み終わるまでは他のプロセスからアクセスされたくないので、 ファイルをアトミックに作成する方法として、Tempfileに一旦書き込んでからrenameする方法が使われています。 https://github.com/rails/rails/blob/7e62a65e18d1e97debfa1c6215b7541157489115/activesupport/lib/active_support/core_ext/file/atomic.rb#L19-L51 似たようなことをしたい場合、 Tempfile.openでは、以下の場合エラーが発生しませんが、 ~~~ Tempfile.open("foo") do |f| f.close File.rename f.path, "bar" end ~~~ Tempfile.createの場合はエラーになります。 ~~~ Tempfile.create("foo") do |f| f.close File.rename f.path, "bar" end #=> Errno::ENOENT: No such file or directory ~~~ Tempfile.createでもエラーが発生しないようになると、 ライブラリーなどの挙動を変えずに、より両者で似たような挙動を期待できるようになるのではないでしょうか。 それとも意図された挙動なのでしょうか。 エラーが発生しないように修正したパッチを添付します。 ---Files-------------------------------- tempfile.patch (947 Bytes) -- https://bugs.ruby-lang.org/