new(basename, *rest)
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, *rest)
if opts = Hash.try_convert(rest[-1])
rest.pop
end
tmpdir = rest[0] || Dir::tmpdir
if $SAFE > 0 and tmpdir.tainted?
tmpdir = '/tmp'
end
lock = tmpname = nil
n = failure = 0
@@lock.synchronize {
begin
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
end
}
@data = [tmpname]
@clean_proc = Tempfile.callback(@data)
ObjectSpace.define_finalizer(self, @clean_proc)
if opts.nil?
opts = []
else
opts = [opts]
end
@tmpfile = File.open(tmpname, File::RDWR|File::CREAT|File::EXCL, 0600, *opts)
@tmpname = tmpname
@@cleanlist << @tmpname
@data[1] = @tmpfile
@data[2] = @@cleanlist
super(@tmpfile)
Dir.rmdir(lock)
end