# tmpdir - retrieve temporary directory path
# $Id: tmpdir.rb 21776 2009-01-26 02:12:10Z shyouhei $
CSIDL_LOCAL_APPDATA = 0x001c
windir = "\0"*(max_pathlen+1)
getdir = Win32API.new('shell32', 'SHGetFolderPath', 'LLLLP', 'L')
raise RuntimeError if getdir.call(0, CSIDL_LOCAL_APPDATA, 0, 0, windir) != 0
windir = File.expand_path(windir.rstrip)
getdir = Win32API.new('kernel32', 'GetSystemWindowsDirectory', 'PL', 'L')
getdir = Win32API.new('kernel32', 'GetWindowsDirectory', 'PL', 'L')
len = getdir.call(windir, windir.size)
windir = File.expand_path(windir[0, len])
temp = File.join(windir.untaint, 'temp')
@@systmpdir = temp if File.directory?(temp) and File.writable?(temp)
# Returns the operating system's temporary file path.
for dir in [ENV['TMPDIR'], ENV['TMP'], ENV['TEMP'],
ENV['USERPROFILE'], @@systmpdir, '/tmp']
if dir and File.directory?(dir) and File.writable?(dir)
# Dir.mktmpdir creates a temporary directory.
# The directory is created with 0700 permission.
# The prefix and suffix of the name of the directory is specified by
# the optional first argument, <i>prefix_suffix</i>.
# - If it is not specified or nil, "d" is used as the prefix and no suffix is used.
# - If it is a string, it is used as the prefix and no suffix is used.
# - If it is an array, first element is used as the prefix and second element is used as a suffix.
# Dir.mktmpdir {|dir| dir is ".../d..." }
# Dir.mktmpdir("foo") {|dir| dir is ".../foo..." }
# Dir.mktmpdir(["foo", "bar"]) {|dir| dir is ".../foo...bar" }
# The directory is created under Dir.tmpdir or
# the optional second argument <i>tmpdir</i> if non-nil value is given.
# Dir.mktmpdir {|dir| dir is "#{Dir.tmpdir}/d..." }
# Dir.mktmpdir(nil, "/var/tmp") {|dir| dir is "/var/tmp/d..." }
# it is yielded with the path of the directory.
# The directory and its contents are removed
# using FileUtils.remove_entry_secure before Dir.mktmpdir returns.
# The value of the block is returned.
# open("#{dir}/foo", "w") { ... }
# If a block is not given,
# The path of the directory is returned.
# In this case, Dir.mktmpdir doesn't remove the directory.
# open("#{dir}/foo", "w") { ... }
# # remove the directory.
# FileUtils.remove_entry_secure dir
def Dir.mktmpdir(prefix_suffix=nil, tmpdir=nil)
prefix = prefix_suffix[0]
suffix = prefix_suffix[1]
raise ArgumentError, "unexpected prefix_suffix: #{prefix_suffix.inspect}"
t = Time.now.strftime("%Y%m%d")
path = "#{tmpdir}/#{prefix}#{t}-#{$$}-#{rand(0x100000000).to_s(36)}"
FileUtils.remove_entry_secure path