new(basename, tmpdir=Dir::tmpdir)
public
Creates a temporary file of mode 0600 in the temporary directory, opens it
with mode "w+", and returns a Tempfile object which represents the created
temporary file. A Tempfile object can be
treated just like a normal File object.
The basename parameter is used to determine the name of a temporary file.
If an Array is given, the first element is used
as prefix string and the second as suffix string, respectively. Otherwise
it is treated as prefix string.
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)
Show source
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)
Dir.rmdir(lock)
end