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)
# File lib/tempfile.rb, line 32
def initialize(basename, *rest)
# I wish keyword argument settled soon.
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)
# Now we have all the File/IO methods defined, you must not
# carelessly put bare puts(), etc. after this.
Dir.rmdir(lock)
end