我很困惑。这是我的代码:
require 'csv'
require 'tempfile'
f = Tempfile.new('csv','/tmp')
f.write 'just wanna test'
f.close
p f.path
如果我打开输出路径,它就是空的。
我认为这是因为每次ruby会话退出时,TempFile都会自动从文件系统中删除。但是,如何确切地知道文件何时被删除?因为我打算用它在我的rails应用程序中创建临时文件,我担心如果文件在使用之前被删除了。
答案 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