Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ruby auto deleting temp file?

I'm confused. Here's my code:

require 'csv'                                                               
require 'tempfile'                                                          

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

p f.path 

If I open the output path, it is empty.

I think this is because that the TempFile got automatically removed from the file system each time the ruby session exits. However, how do I know exactly when the file got deleted? Because I'm thinking to use it to create temp file within my rails app, I'm afraid if the file got deleted before it is used.

like image 763
songyy Avatar asked Jul 06 '15 04:07

songyy


People also ask

Are temporary files deleted automatically?

Most of the temporary files that the system uses are deleted automatically after the task is complete. But there can be some files which stay in your storage for future use. The same can apply for your daily use programs which need these temporary files to complete operations and tasks faster for the users.

Why are TMP files not deleting automatically?

So why do those files not get automatically deleted? First, if Windows shuts down improperly, the contents of the Temp folder may not be emptied. Also, some applications, such as synchronization software for handheld devices, use the Temp folder and may not delete all the files they leave behind.

How do you create a temp file in Ruby?

In any case, all arguments ( basename , tmpdir , mode , and **options ) will be treated as ::new. Creates a temporary file with permissions 0600 (= only readable and writable by the owner) and opens it with mode “w+”. The temporary file will be placed in the directory as specified by the tmpdir parameter.

What is file rewind in Ruby?

Rewind resets the line number to zero f = File.new("testfile") f.readline #=> "This is line one\n" f.rewind #=> 0 f.lineno #=> 0 f.readline #=> "This is line one\n" IO#close. Closes ios and flushes any pending writes to the operating system. read([length [, outbuf]]) Reads length bytes from the I/O stream.


1 Answers

I've seen Tempfile being garbage collected in the same process when I created many temp files to be zipped. In the code below, if I didn't store the Tempfile handles in the handles array I would get runtime error (Errno::ENOENT: No such file or directory @ rb_sysopen) when the Zip::File.open block closes:

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
like image 60
joshweir Avatar answered Oct 07 '22 03:10

joshweir