blob: a6ffaa55fefb73791677c7d7e0d226ab4a23ab6b (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
#
# $Id$
# Copyright (C) 1998 akira yamada. All rights reserved.
# This file can be distributed under the terms of the Ruby.
# 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 created temporary files are removed if it is closed or garbage collected,
# or script termination.
# o file mode of the temporary files are 0600.
require 'delegate'
class Tempfile < SimpleDelegater
Max_try = 10
def initialize(basename, tmpdir = '/tmp')
@tmpdir = tmpdir
umask = File.umask(0177)
cwd = Dir.getwd
Dir.chdir(@tmpdir)
begin
n = 0
while true
begin
@tmpname = sprintf('%s.%d.%d', basename, $$, n)
unless File.exist?(@tmpname)
File.symlink('.', @tmpname + '.lock')
break
end
rescue
raise "cannot generate tmpfile `%s'" % @tmpname if n >= Max_try
#sleep(1)
end
n += 1
end
@clean_files = proc {|id|
if File.exist?(@tmpdir + '/' + @tmpname)
File.unlink(@tmpdir + '/' + @tmpname)
end
if File.exist?(@tmpdir + '/' + @tmpname + '.lock')
File.unlink(@tmpdir + '/' + @tmpname + '.lock')
end
}
ObjectSpace.call_finalizer(self)
ObjectSpace.add_finalizer(@clean_files)
@tmpfile = open(@tmpname, 'w+')
super(@tmpfile)
File.unlink(@tmpname + '.lock')
ensure
File.umask(umask)
Dir.chdir(cwd)
end
end
def close
super
@clean_files.call
end
end
|