=== modified file 'django/core/files/move.py'
--- django/core/files/move.py	2008-08-11 16:51:18 +0000
+++ django/core/files/move.py	2008-08-21 08:21:28 +0000
@@ -10,12 +10,6 @@
 
 __all__ = ['file_move_safe']
 
-try:
-    import shutil
-    file_move = shutil.move
-except ImportError:
-    file_move = os.rename
-
 def file_move_safe(old_file_name, new_file_name, chunk_size = 1024*64, allow_overwrite=False):
     """
     Moves a file from one location to another in the safest way possible.
@@ -33,28 +27,37 @@
     if old_file_name == new_file_name:
         return
 
-    if not allow_overwrite and os.path.exists(new_file_name):
-        raise IOError("Cannot overwrite existing file '%s'." % new_file_name)
-
     try:
-        file_move(old_file_name, new_file_name)
+        os.rename(old_file_name, new_file_name)
         return
     except OSError:
         # This will happen with os.rename if moving to another filesystem
+        # or when moving opened files on certain operating systems
         pass
 
-    # If the built-in didn't work, do it the hard way.
-    fd = os.open(new_file_name, os.O_WRONLY | os.O_CREAT | os.O_EXCL | getattr(os, 'O_BINARY', 0))
+    # first open the old file, so that it won't go away
+    old_file = open(old_file_name, 'rb')
     try:
-        locks.lock(fd, locks.LOCK_EX)
-        old_file = open(old_file_name, 'rb')
-        current_chunk = None
-        while current_chunk != '':
-            current_chunk = old_file.read(chunk_size)
-            os.write(fd, current_chunk)
+        # now open the new file, not forgetting allow_overwrite
+        fd = os.open(new_file_name, os.O_WRONLY | os.O_CREAT | getattr(os, 'O_BINARY', 0) |
+                                    (not allow_overwrite and os.O_EXCL or 0))
+        try:
+            locks.lock(fd, locks.LOCK_EX)
+            current_chunk = None
+            while current_chunk != '':
+                current_chunk = old_file.read(chunk_size)
+                os.write(fd, current_chunk)
+        finally:
+            locks.unlock(fd)
+            os.close(fd)
     finally:
-        locks.unlock(fd)
-        os.close(fd)
         old_file.close()
 
-    os.remove(old_file_name)
+    try:
+        os.remove(old_file_name)
+    except OSError, e:
+        # Certain operating systems (Cygwin and Windows)
+        # fail when deleting opened files, ignore it
+        if getattr(e, 'winerror', 0) != 32:
+            # FIXME: should we also ignore errno 13?
+            raise

=== modified file 'django/core/files/temp.py'
--- django/core/files/temp.py	2008-07-26 22:48:51 +0000
+++ django/core/files/temp.py	2008-08-21 08:34:11 +0000
@@ -10,6 +10,7 @@
 """
 
 import os
+import sys
 import tempfile
 
 __all__ = ('NamedTemporaryFile', 'gettempdir',)
@@ -25,31 +26,35 @@
             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
+
+        # Because close can be called during shutdown
+        # we need to cache os.unlink and access it
+        # as self.unlink only
+        unlink = os.unlink
+
+        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):
-            try:
-                self._file.close()
-            except (OSError, IOError):
-                pass
-            try:
-                os.unlink(self.name)
-            except (OSError):
-                pass
-
-            try:
-                super(TemporaryFile, self).__del__()
-            except AttributeError:
-                pass
-
-
-        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()
+            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 __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:

