summaryrefslogtreecommitdiff
path: root/django/core/files/temp.py
diff options
context:
space:
mode:
authorMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2008-08-23 17:56:02 +0000
committerMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2008-08-23 17:56:02 +0000
commita9f0ae706a8dc035543ac64a1e87e9621a35fa00 (patch)
tree8b2d416e9dbe5c37e46eeaaaa7b2abc00f3f7f98 /django/core/files/temp.py
parenteaa64cd889587f4d459ab0bb62c96c04d362d0eb (diff)
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. git-svn-id: http://code.djangoproject.com/svn/django/trunk@8493 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django/core/files/temp.py')
-rw-r--r--django/core/files/temp.py46
1 files changed, 25 insertions, 21 deletions
diff --git a/django/core/files/temp.py b/django/core/files/temp.py
index 298fcbf0a5..f0d7d744ba 100644
--- a/django/core/files/temp.py
+++ b/django/core/files/temp.py
@@ -25,31 +25,35 @@ if os.name == 'nt':
fd, name = tempfile.mkstemp(suffix=suffix, prefix=prefix,
dir=dir)
self.name = name
- self._file = os.fdopen(fd, mode, bufsize)
+ self.file = os.fdopen(fd, mode, bufsize)
+ self.close_called = False
- def __del__(self):
- try:
- self._file.close()
- except (OSError, IOError):
- pass
- try:
- os.unlink(self.name)
- except (OSError):
- pass
+ # Because close can be called during shutdown
+ # we need to cache os.unlink and access it
+ # as self.unlink only
+ unlink = os.unlink
- try:
- super(TemporaryFile, self).__del__()
- except AttributeError:
- pass
+ def close(self):
+ if not self.close_called:
+ self.close_called = True
+ try:
+ self.file.close()
+ except (OSError, IOError):
+ pass
+ try:
+ self.unlink(self.name)
+ except (OSError):
+ pass
+ def __del__(self):
+ self.close()
- def read(self, *args): return self._file.read(*args)
- def seek(self, offset): return self._file.seek(offset)
- def write(self, s): return self._file.write(s)
- def close(self): return self._file.close()
- def __iter__(self): return iter(self._file)
- def readlines(self, size=None): return self._file.readlines(size)
- def xreadlines(self): return self._file.xreadlines()
+ def read(self, *args): return self.file.read(*args)
+ def seek(self, offset): return self.file.seek(offset)
+ def write(self, s): return self.file.write(s)
+ def __iter__(self): return iter(self.file)
+ def readlines(self, size=None): return self.file.readlines(size)
+ def xreadlines(self): return self.file.xreadlines()
NamedTemporaryFile = TemporaryFile
else: