Ruby自动删除临时文件?

时间:2015-07-06 04:30:40

标签: ruby-on-rails ruby

我很困惑。这是我的代码:

require 'csv'                                                               
require 'tempfile'                                                          

f = Tempfile.new('csv','/tmp')                                                 
f.write 'just wanna test'                                                       
f.close                                                                        

p f.path 

如果我打开输出路径,它就是空的。

我认为这是因为每次ruby会话退出时,TempFile都会自动从文件系统中删除。但是,如何确切地知道文件何时被删除?因为我打算用它在我的rails应用程序中创建临时文件,我担心如果文件在使用之前被删除了。

3 个答案:

答案 0 :(得分:9)

来自docs:

  

当垃圾收集Tempfile对象时,或者Ruby解释器退出时,会自动删除其关联的临时文件。

因此,只要您在范围内有f,就不会删除它。如果退出Ruby,它将被删除。如果您仍然使用Ruby但f已超出范围,则它是不确定的(可能未删除,但不保证存在,不应使用。)

答案 1 :(得分:4)

当收集垃圾时,临时文件被删除(它不再被引用,内存清理正在释放对象)。

Ruby documentation中所述:

  

当Tempfile对象被垃圾收集时,或者Ruby解释器退出时,其关联的临时文件会自动删除...

只要您仍然持有对太阳穴物体的参考,您就不必担心它会被过早删除。

答案 2 :(得分:1)

当我创建许多要压缩的临时文件时,我发现Tempfile是在同一过程中被垃圾回收的。在下面的代码中,如果我没有将Tempfile句柄存储在handles数组中,则在Errno::ENOENT: No such file or directory @ rb_sysopen块关闭时,我会得到运行时错误(Zip::File.open):

handles = []
Zip::File.open(zip_file.path, Zip::File::CREATE) do |zip|
  # there are hundreds of @foos to iterate over
  @foos.each do |foo|
    cit_filename = generate_some_unique_filename
    cit_file = Tempfile.new(cit_filename)
    handles << cit_file
    cit_file.puts('some text')
    cit_file.close
    zip.add(cit_filename, cit_file.path)
  end
end # <- runtime error would have thrown at this point
handles = nil