Ответ 1
Не совсем. Для самого вопроса см. Это:
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
, которые ОС автоматически очищает каждый раз через некоторое время (например при каждой загрузке). Из-за этого, даже если вы "сохраняете" файл, вам либо нужно быть в порядке с его исчезновением, либо переместить его в каталог, который по умолчанию не очищается, например /var/tmp
(каталог Linux для постоянного файлы).
Что касается вашего второго вопроса, попробуйте этот код здесь:
Dir::Tmpname.create('your_application_prefix') { |path| puts path }
Для этого требуется require "tmpdir"
.