blob: 1acd251a55f1c0963d5ce28b908a999be8617ea2 [file] [log] [blame]
Guido van Rossumeee94981991-11-12 15:38:08 +00001# Temporary file name allocation
Guido van Rossum41f95031992-03-31 19:02:01 +00002#
3# XXX This tries to be not UNIX specific, but I don't know beans about
4# how to choose a temp directory or filename on MS-DOS or other
5# systems so it may have to be changed...
Guido van Rossumeee94981991-11-12 15:38:08 +00006
7
Guido van Rossum41f95031992-03-31 19:02:01 +00008import os
Guido van Rossumeee94981991-11-12 15:38:08 +00009
Guido van Rossumeee94981991-11-12 15:38:08 +000010
Guido van Rossum41f95031992-03-31 19:02:01 +000011# Parameters that the caller may set to override the defaults
Guido van Rossumcff34541992-01-14 18:31:56 +000012
Guido van Rossum41f95031992-03-31 19:02:01 +000013tempdir = None
14template = None
15
16
17# Function to calculate the directory to use
18
19def gettempdir():
Guido van Rossumf4aaf861996-05-28 23:31:34 +000020 global tempdir
Guido van Rossum4033ad71996-08-08 18:33:56 +000021 if tempdir is not None:
22 return tempdir
Guido van Rossumf4aaf861996-05-28 23:31:34 +000023 attempdirs = ['/usr/tmp', '/tmp', os.getcwd(), os.curdir]
Guido van Rossum3e065ad1996-08-20 20:38:59 +000024 if os.name == 'nt':
25 attempdirs.insert(0, 'C:\\TEMP')
26 attempdirs.insert(0, '\\TEMP')
Guido van Rossumf4f756c1997-04-11 19:00:53 +000027 elif os.name == 'mac':
28 import macfs, MACFS
29 try:
30 refnum, dirid = macfs.FindFolder(MACFS.kOnSystemDisk, MACFS.kTemporaryFolderType, 0)
31 dirname = macfs.FSSpec((refnum, dirid, '')).as_pathname()
32 attempdirs.insert(0, dirname)
33 except macfs.error:
34 pass
Guido van Rossumf4aaf861996-05-28 23:31:34 +000035 if os.environ.has_key('TMPDIR'):
36 attempdirs.insert(0, os.environ['TMPDIR'])
Guido van Rossum3e065ad1996-08-20 20:38:59 +000037 testfile = gettempprefix() + 'test'
Guido van Rossumf4aaf861996-05-28 23:31:34 +000038 for dir in attempdirs:
39 try:
40 filename = os.path.join(dir, testfile)
41 fp = open(filename, 'w')
42 fp.write('blat')
43 fp.close()
44 os.unlink(filename)
45 tempdir = dir
46 break
47 except IOError:
48 pass
49 if tempdir is None:
50 msg = "Can't find a usable temporary directory amongst " + `attempdirs`
51 raise IOError, msg
52 return tempdir
Guido van Rossum41f95031992-03-31 19:02:01 +000053
54
55# Function to calculate a prefix of the filename to use
56
57def gettempprefix():
58 global template
59 if template == None:
60 if os.name == 'posix':
61 template = '@' + `os.getpid()` + '.'
Guido van Rossumf4f756c1997-04-11 19:00:53 +000062 elif os.name == 'mac':
63 template = 'Python-Tmp-'
Guido van Rossum41f95031992-03-31 19:02:01 +000064 else:
65 template = 'tmp' # XXX might choose a better one
66 return template
Guido van Rossumcff34541992-01-14 18:31:56 +000067
Guido van Rossumeee94981991-11-12 15:38:08 +000068
Guido van Rossum4a3a41f1991-12-26 13:10:50 +000069# Counter for generating unique names
Guido van Rossumeee94981991-11-12 15:38:08 +000070
Guido van Rossum4a3a41f1991-12-26 13:10:50 +000071counter = 0
Guido van Rossumeee94981991-11-12 15:38:08 +000072
73
Guido van Rossum41f95031992-03-31 19:02:01 +000074# User-callable function to return a unique temporary file name
Guido van Rossumeee94981991-11-12 15:38:08 +000075
76def mktemp():
Guido van Rossum4a3a41f1991-12-26 13:10:50 +000077 global counter
Guido van Rossum41f95031992-03-31 19:02:01 +000078 dir = gettempdir()
79 pre = gettempprefix()
Guido van Rossumeee94981991-11-12 15:38:08 +000080 while 1:
Guido van Rossum41f95031992-03-31 19:02:01 +000081 counter = counter + 1
82 file = os.path.join(dir, pre + `counter`)
83 if not os.path.exists(file):
84 return file