diff options
| author | Malcolm Tredinnick <malcolm.tredinnick@gmail.com> | 2008-08-23 17:56:02 +0000 |
|---|---|---|
| committer | Malcolm Tredinnick <malcolm.tredinnick@gmail.com> | 2008-08-23 17:56:02 +0000 |
| commit | a9f0ae706a8dc035543ac64a1e87e9621a35fa00 (patch) | |
| tree | 8b2d416e9dbe5c37e46eeaaaa7b2abc00f3f7f98 /django/core/files/temp.py | |
| parent | eaa64cd889587f4d459ab0bb62c96c04d362d0eb (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.py | 46 |
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: |
