Django

Code

root/django/trunk/django/core/files/temp.py

Revision 8493, 2.1 kB (checked in by mtredinnick, 3 months ago)

Fixed #8203 -- Fixed temporary file deleation on Windows and a couple of edge
cases on Unix-like systems. Patch from snaury. Testing and verification on
Windows, Mac and Linux from cgrady and ramikassab.

Line 
1 """
2 The temp module provides a NamedTemporaryFile that can be re-opened on any
3 platform. Most platforms use the standard Python tempfile.TemporaryFile class,
4 but MS Windows users are given a custom class.
5
6 This is needed because in Windows NT, the default implementation of
7 NamedTemporaryFile uses the O_TEMPORARY flag, and thus cannot be reopened [1].
8
9 1: http://mail.python.org/pipermail/python-list/2005-December/359474.html
10 """
11
12 import os
13 import tempfile
14
15 __all__ = ('NamedTemporaryFile', 'gettempdir',)
16
17 if os.name == 'nt':
18     class TemporaryFile(object):
19         """
20         Temporary file object constructor that works in Windows and supports
21         reopening of the temporary file in windows.
22         """
23         def __init__(self, mode='w+b', bufsize=-1, suffix='', prefix='',
24                 dir=None):
25             fd, name = tempfile.mkstemp(suffix=suffix, prefix=prefix,
26                                           dir=dir)
27             self.name = name
28             self.file = os.fdopen(fd, mode, bufsize)
29             self.close_called = False
30
31         # Because close can be called during shutdown
32         # we need to cache os.unlink and access it
33         # as self.unlink only
34         unlink = os.unlink
35
36         def close(self):
37             if not self.close_called:
38                 self.close_called = True
39                 try:
40                     self.file.close()
41                 except (OSError, IOError):
42                     pass
43                 try:
44                     self.unlink(self.name)
45                 except (OSError):
46                     pass
47
48         def __del__(self):
49             self.close()
50
51         def read(self, *args):          return self.file.read(*args)
52         def seek(self, offset):         return self.file.seek(offset)
53         def write(self, s):             return self.file.write(s)
54         def __iter__(self):             return iter(self.file)
55         def readlines(self, size=None): return self.file.readlines(size)
56         def xreadlines(self):           return self.file.xreadlines()
57
58     NamedTemporaryFile = TemporaryFile
59 else:
60     NamedTemporaryFile = tempfile.NamedTemporaryFile
61
62 gettempdir = tempfile.gettempdir
Note: See TracBrowser for help on using the browser.