Differences between revisions 16 and 17
Revision 16 as of 2011-06-17 22:43:34
Size: 2199
Editor: abuehl
Comment:
Revision 17 as of 2012-10-25 21:17:12
Size: 2201
Editor: mpm
Comment:
Deletions are marked like this. Additions are marked like this.
Line 3: Line 3:
<<Include(A:dev)>>
<<Include(A:historic)>>
Line 4: Line 7:

/!\ This page is intended for developers.

Note:

This page is primarily intended for developers of Mercurial.

Note:

This page is no longer relevant but is kept for historical purposes.

Unlinking Files on Windows

This page describes what happens when Python's 'os.unlink(f)' is called on Windows.

1. File opened using Python's "open"

If the file f itself or any hardlinked copy of f has been opened for reading by another process using Python's 'open()', then calling 'os.unlink(f)' or 'os.rename(f, ..)' will raise

WindowsError: [Error 32] The process cannot access the file because it is being
used by another process: <f>

This could be fixed in Microsoft's C runtime implementation by patching the file open.c (VC8):

diff --git a/open.c b/open.c
--- a/open.c
+++ b/open.c
@@ -395,6 +395,9 @@

         *punlock_flag = 1;

+        if (osplatform == VER_PLATFORM_WIN32_NT )
+            fileshare  |= FILE_SHARE_DELETE;
+
         /*
          * try to open/create the file
          */

and then making sure Python would use that modified C runtime. Python's 'open' would then behave like Mercurial's 'posixfile'.

2. File opened using Mercurial's "posixfile"

If the file f has been opened for reading by another process with 'posixfile(f)', calling 'os.rename(f, ..)' succeeds.

Calling unlink will send that file into a "scheduled delete" state.

Scheduled delete has the following characteristics:

  • (a) the entry in the directory for f is still kept
  • (b) calling 'fd = posixfile(f, 'w')' will raise 'IOError: [Errno 13] <f>: Access is denied'

  • (c) calling 'os.rename(f, f+'.foo')' will raise 'WindowsError: [Error 5] Access is denied'

  • (d) calling 'os.lstat(f)' will raise 'WindowsError: [Error 5] Access is denied: <f>'

  • (e) calling 'os.path.exists(f)' returns False

Scheduled delete is left as soon as the other process closes the file.

3. See also


CategoryInternals

UnlinkingFilesOnWindows (last edited 2017-09-02 08:00:32 by abuehl)