Подтвердить что ты не робот

Есть ли способ сделать постоянный постоянный файл Ruby?

Если я создал временный файл через Tempfile, есть ли способ, кроме копирования его в другой файл, который я могу сделать его "постоянным"? Я бы хотел, чтобы он не удалялся, когда связанный экземпляр Tempfile собирал мусор или завершался процесс.

В связанной точке есть ли способ использовать механизм Tempfile (или использовать аналогичный механизм) для получения "нового" имени файла без необходимости создания файла с этим именем?

4b9b3361

Ответ 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".

Ответ 2

Я думаю, что самым простым решением может быть для обезьяны заплатить класс Tmpfile, чтобы добавить метод persist. Этот метод принимает имя файла, в который будет перемещен временный файл. Кроме того, он удаляет финализатор, чтобы временный файл не удалялся при выходе.

require 'tempfile'
require 'fileutils'

class Tempfile
  def persist(filename)
    FileUtils.mv(self.path, filename)
    ObjectSpace.undefine_finalizer(self)
  end
end

file = Tempfile.new('tmp')
file.write('hello world')
file.close
file.persist('hello.txt')

Запуск этой программы создает постоянный файл ./hello.txt, перемещая исходный временный файл, а не копируя его.