In Files

  • tempfile.rb

Parent

Class/Module Index [+]

Quicksearch

Tempfile

A class for managing temporary files. This library is written to be thread safe.

Constants

MAX_TRY

Public Class Methods

new(basename, tmpdir=Dir::tmpdir) click to toggle source

Creates a temporary file of mode 0600 in the temporary directory whose name is basename.pid.n and opens with mode “w+”. A Tempfile object works just like a File object.

If tmpdir is omitted, the temporary directory is determined by Dir::tmpdir provided by 'tmpdir.rb'. When $SAFE > 0 and the given tmpdir is tainted, it uses /tmp. (Note that ENV values are tainted by default)

 
               # File tempfile.rb, line 24
def initialize(basename, tmpdir=Dir::tmpdir)
  if $SAFE > 0 and tmpdir.tainted?
    tmpdir = '/tmp'
  end

  lock = nil
  n = failure = 0
  
  begin
    Thread.critical = true

    begin
      tmpname = File.join(tmpdir, make_tmpname(basename, n))
      lock = tmpname + '.lock'
      n += 1
    end while @@cleanlist.include?(tmpname) or
      File.exist?(lock) or File.exist?(tmpname)

    Dir.mkdir(lock)
  rescue
    failure += 1
    retry if failure < MAX_TRY
    raise "cannot generate tempfile `%s'" % tmpname
  ensure
    Thread.critical = false
  end

  @data = [tmpname]
  @clean_proc = Tempfile.callback(@data)
  ObjectSpace.define_finalizer(self, @clean_proc)

  @tmpfile = File.open(tmpname, File::RDWR|File::CREAT|File::EXCL, 0600)
  @tmpname = tmpname
  @@cleanlist << @tmpname
  @data[1] = @tmpfile
  @data[2] = @@cleanlist

  super(@tmpfile)

  # Now we have all the File/IO methods defined, you must not
  # carelessly put bare puts(), etc. after this.

  Dir.rmdir(lock)
end
            
open(*args) click to toggle source

If no block is given, this is a synonym for new().

If a block is given, it will be passed tempfile as an argument, and the tempfile will automatically be closed when the block terminates. In this case, open() returns nil.

 
               # File tempfile.rb, line 167
def open(*args)
  tempfile = new(*args)

  if block_given?
    begin
      yield(tempfile)
    ensure
      tempfile.close
    end

    nil
  else
    tempfile
  end
end
            

Public Instance Methods

close(unlink_now=false) click to toggle source

Closes the file. If the optional flag is true, unlinks the file after closing.

If you don't explicitly unlink the temporary file, the removal will be delayed until the object is finalized.

 
               # File tempfile.rb, line 93
def close(unlink_now=false)
  if unlink_now
    close!
  else
    _close
  end
end
            
close!() click to toggle source

Closes and unlinks the file.

 
               # File tempfile.rb, line 102
def close!
  _close
  @clean_proc.call
  ObjectSpace.undefine_finalizer(self)
end
            
delete() click to toggle source
Alias for: unlink
length() click to toggle source
Alias for: size
open() click to toggle source

Opens or reopens the file with mode “r+”.

 
               # File tempfile.rb, line 75
def open
  @tmpfile.close if @tmpfile
  @tmpfile = File.open(@tmpname, 'r+')
  @data[1] = @tmpfile
  __setobj__(@tmpfile)
end
            
path() click to toggle source

Returns the full path name of the temporary file.

 
               # File tempfile.rb, line 126
def path
  @tmpname
end
            
size() click to toggle source

Returns the size of the temporary file. As a side effect, the IO buffer is flushed before determining the size.

 
               # File tempfile.rb, line 132
def size
  if @tmpfile
    @tmpfile.flush
    @tmpfile.stat.size
  else
    0
  end
end
            
Also aliased as: length