[英]Ruby auto deleting temp file?
我糊塗了。 這是我的代碼:
require 'csv'
require 'tempfile'
f = Tempfile.new('csv','/tmp')
f.write 'just wanna test'
f.close
p f.path
如果我打開輸出路徑,它是空的。
我認為這是因為每次 ruby 會話退出時,TempFile 都會自動從文件系統中刪除。 但是,我如何確切知道文件何時被刪除? 因為我想用它在我的 rails 應用程序中創建臨時文件,所以我擔心該文件在使用之前是否被刪除。
從文檔:
當 Tempfile 對象被垃圾收集時,或者當 Ruby 解釋器退出時,其關聯的臨時文件將被自動刪除。
所以,只要你的f
在范圍內,它就不會被刪除。 如果您退出 Ruby,它將被刪除。 如果您仍在使用 Ruby 但f
已超出范圍,則它是不確定的(可能未刪除,但不能保證存在,不應使用。)
當臨時文件被垃圾收集時會被刪除(它不再被引用並且內存清理正在釋放對象)。
正如Ruby 文檔中所述:
當一個 Tempfile 對象被垃圾收集時,或者當 Ruby 解釋器退出時,它關聯的臨時文件會被自動刪除......
只要您仍然持有對臨時對象的引用,您就不必擔心它會被過早刪除。
當我創建許多要壓縮的臨時文件時,我已經看到Tempfile
在同一進程中被垃圾收集。 在下面的代碼中,如果我沒有將Tempfile
句柄存儲在handles
數組中,當Zip::File.open
塊關閉時,我會得到運行時錯誤( Errno::ENOENT: No such file or directory @ rb_sysopen
):
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.