rails - ¿Hay alguna manera de hacer un archivo temporal de Ruby permanente?
tempfile rails (2)
Si he creado un archivo temporal a través de Tempfile
, ¿hay alguna forma, aparte de copiarlo en otro archivo, de que pueda hacerlo "permanente"? Me gustaría evitar que se elimine cuando la instancia de Tempfile
asociada se recolecta como basura o se termina el proceso.
En un punto relacionado, ¿hay una manera de aprovechar el mecanismo Tempfile
(o usar un mecanismo similar) para obtener un "nuevo" nombre de archivo sin tener que crear un archivo con ese nombre?
Creo que la solución más sencilla puede ser parchear la clase Tmpfile
para agregar un método de persist
. Este método toma un nombre de archivo al que se moverá el archivo temporal. Además, elimina el finalizador para que el archivo temporal no se elimine al salir.
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'')
La ejecución de este programa creará un archivo persistente ./hello.txt
moviendo el archivo temporal original en lugar de copiarlo.
Realmente no. Para la pregunta en sí, ver esto:
ObjectSpace.undefine_finalizer(tmpfile)
La biblioteca Tempfile usa los finalizadores de Ruby ObjectSpace para eliminarse automáticamente en la recolección de basura. Al utilizar la línea anterior, puede eliminar la capacidad del Tempfile para eliminarse a sí mismo si no lo elimina. Así por ejemplo:
$ 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!
$
Sin embargo, hay algo más que tener en cuenta. Tempfile utilizará directorios de archivos temporales del sistema como /tmp
que el sistema operativo limpia automáticamente de vez en cuando (por ejemplo, en cada arranque ). Debido a esto, incluso si "persistes" en el archivo, debes estar de acuerdo con que desaparezca o moverlo a un directorio que no se elimine de forma predeterminada, como /var/tmp
(el directorio de Linux para persistentes archivos temporales).
En cuanto a tu segunda pregunta, prueba este código desde here :
Dir::Tmpname.create(''your_application_prefix'') { |path| puts path }
Requiere un require "tmpdir"
.