|
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 from django.core.files.utils import FileProxyMixin |
|
15 |
|
16 __all__ = ('NamedTemporaryFile', 'gettempdir',) |
|
17 |
|
18 if os.name == 'nt': |
|
19 class TemporaryFile(FileProxyMixin): |
|
20 """ |
|
21 Temporary file object constructor that works in Windows and supports |
|
22 reopening of the temporary file in windows. |
|
23 """ |
|
24 def __init__(self, mode='w+b', bufsize=-1, suffix='', prefix='', |
|
25 dir=None): |
|
26 fd, name = tempfile.mkstemp(suffix=suffix, prefix=prefix, |
|
27 dir=dir) |
|
28 self.name = name |
|
29 self.file = os.fdopen(fd, mode, bufsize) |
|
30 self.close_called = False |
|
31 |
|
32 # Because close can be called during shutdown |
|
33 # we need to cache os.unlink and access it |
|
34 # as self.unlink only |
|
35 unlink = os.unlink |
|
36 |
|
37 def close(self): |
|
38 if not self.close_called: |
|
39 self.close_called = True |
|
40 try: |
|
41 self.file.close() |
|
42 except (OSError, IOError): |
|
43 pass |
|
44 try: |
|
45 self.unlink(self.name) |
|
46 except (OSError): |
|
47 pass |
|
48 |
|
49 def __del__(self): |
|
50 self.close() |
|
51 |
|
52 NamedTemporaryFile = TemporaryFile |
|
53 else: |
|
54 NamedTemporaryFile = tempfile.NamedTemporaryFile |
|
55 |
|
56 gettempdir = tempfile.gettempdir |