Rubyの一時ファイルを永続的なものにする方法はありますか?

概要

Tempfile を使用して一時ファイルを作成した場合、それを別のファイルにコピーする以外に、それを「永久」にする方法はありますか?関連する Tempfile インスタンスがガベージ コレクションされたとき、またはプロセスが終了したときに削除されるのを避けたいと考えています。

関連した点として、Tempfile メカニズムを利用する (または同様のメカニズムを使用する) ことで、その名前でファイルを作成せずに「新しい」ファイル名を取得する方法はありますか?

解決策

あまり。質問自体については、これを参照してください。

ObjectSpace.undefine_finalizer(tmpfile)

Tempfile ライブラリは、Ruby ObjectSpace ファイナライザーを使用して、ガベージ コレクション時にそれ自体を自動的に削除します。上記の行を使用すると、Tempfile を削除しない場合にそれ自体を削除する機能を削除できます。たとえば、次のようになります。

$ irb
2.0.0p0 :001 > require "tempfile"
 => true 
2.0.0p0 :002 > t = Tempfile.new("test")
 => #<Tempfile:/tmp/test20140122-6655-80p4b7> 
2.0.0p0 :003 > t.write("Hi!")
 => 3 
2.0.0p0 :004 > ObjectSpace.undefine_finalizer(t)
 => #<Tempfile:/tmp/test20140122-6655-80p4b7> 
2.0.0p0 :005 > exit
$ cat /tmp/test20140122-6655-80p4b7
Hi!
$ 

ただし、他にも注意すべきことがあります。 Tempfile は /tmp のようなシステム一時ファイル ディレクトリを使用します。このディレクトリは、OS が時々 (たとえば、起動するたびに) 自動的に削除します。このため、ファイルを「永続化」した場合でも、ファイルが消えても問題がないようにするか、/var/tmp (永続化用の Linux ディレクトリ) など、デフォルトでは消去されないディレクトリにファイルを移動する必要があります。一時ファイル)。

2 番目の質問に関しては、ここからこのコードを試してください。

Dir::Tmpname.create('your_application_prefix') { |path| puts path }

これには、require “tmpdir” が必要です。