this keeps backwards compact, but also lets you do
Dir.tmpdir do
puts "in tmpdir #{ Dir.pwd }"
end
the tmpdir will be created for you and cleaned up too
class Dir
module Tmpdir
require 'tmpdir'
require 'socket'
require 'fileutils'
unless defined?(Super)
Super = Dir.send(:method, :tmpdir)
class << Dir
remove_method :tmpdir
end
end
class Error < ::StandardError; end
Hostname = Socket.gethostname || 'localhost'
Pid = Process.pid
Ppid = Process.ppid
def tmpdir *args, &block
options = Hash === args.last ? args.pop : {}
dirname = Super.call(*args)
return dirname unless block
turd = options['turd'] || options[:turd]
basename = [
Hostname,
Ppid,
Pid,
Thread.current.object_id.abs,
rand
].join('-')
pathname = File.join dirname, basename
made = false
42.times do
begin
FileUtils.mkdir_p pathname
break(made = true)
rescue Object
sleep rand
:retry
end
end
raise Error, "failed to make tmpdir in #{ dirname.inspect }" unless made
begin
return Dir.chdir(pathname, &block)
ensure
unless turd
FileUtils.rm_rf(pathname) if made
end
end
end
end
extend Tmpdir
end
a @ http://codeforpeople.com/
···
On Oct 23, 2008, at 2:24 PM, Kenneth McDonald wrote:
I'd like to be able to obtain a temporary directory in the same way I can easily obtain a temporary file, but there doesn't seem to be a function for this. Currently, I'm creating a temp file, getting it's name, unlinking it, and then creating a dir with the same name. But this is ugly, and in theory subject to a race condition. Is there a better way of doing this?
Thanks,
Ken
--
we can deny everything, except that we have the possibility of being better. simply reflect on that.
h.h. the 14th dalai lama