From 7425d4f6ef047dd274cbea8115955462d5449330 Mon Sep 17 00:00:00 2001 From: "(no author)" <(no author)@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> Date: Fri, 27 Feb 1998 07:48:11 +0000 Subject: This commit was manufactured by cvs2svn to create tag 'r1_1b9'. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/tags/r1_1b9@100 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/tempfile.rb | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 lib/tempfile.rb (limited to 'lib/tempfile.rb') diff --git a/lib/tempfile.rb b/lib/tempfile.rb new file mode 100644 index 0000000000..9d986e7691 --- /dev/null +++ b/lib/tempfile.rb @@ -0,0 +1,88 @@ +# +# $Id$ +# +# The class for temporary files. +# o creates a temporary file, which name is "basename.pid.n" with mode "w+". +# o Tempfile objects can be used like IO object. +# o with tmpfile.close(true) created temporary files are removed. +# o created files are also removed on script termination. +# o with Tempfile#open, you can reopen the temporary file. +# o file mode of the temporary files are 0600. + +require 'delegate' +require 'final' + +class Tempfile < SimpleDelegator + Max_try = 10 + + def Tempfile.callback(path) + lambda{ + print "removing ", path, "..." + if File.exist?(path) + File.unlink(path) + end + if File.exist?(path + '.lock') + File.unlink(path + '.lock') + end + print "done\n" + } + end + + def initialize(basename, tmpdir = '/tmp') + umask = File.umask(0177) + begin + n = 0 + while true + begin + @tmpname = sprintf('%s/%s.%d.%d', tmpdir, basename, $$, n) + unless File.exist?(@tmpname) + File.symlink(tmpdir, @tmpname + '.lock') + break + end + rescue + raise "cannot generate tmpfile `%s'" % @tmpname if n >= Max_try + #sleep(1) + end + n += 1 + end + + @clean_files = Tempfile.callback(@tmpname) + ObjectSpace.define_finalizer(self, @clean_files) + + @tmpfile = File.open(@tmpname, 'w+') + super(@tmpfile) + File.unlink(@tmpname + '.lock') + ensure + File.umask(umask) + end + end + + def Tempfile.open(*args) + Tempfile.new(*args) + end + + def open + @tmpfile.close if @tmpfile + @tmpfile = File.open(@tmpname, 'r+') + __setobj__(@tmpfile) + end + + def close(real=false) + @tmpfile.close if @tmpfile + @tmpfile = nil + if real + @clean_files.call + ObjectSpace.undefine_finalizer(self) + end + end +end + +if __FILE__ == $0 + f = Tempfile.new("foo") + f.print("foo\n") + f.close + f = nil + f.open + p f.gets # => "foo\n" + f.close(true) +end -- cgit v1.2.3