Tim Golden <m...@timgolden.me.uk> added the comment:

In one window run the attached script (assumes you have pywin32 installed) with 
a parameter of the directory the TESTFN file will end up in. Then run, eg, 
test_zipfile in another window. For me:

c:\temp> watch_dir.py C:\work_in_progress\make-snapshots\trunk\python\Lib

C:\work_in_progress\make-snapshots\trunk\python\Lib> ..\pcbuild\python.exe -m 
test.test_zipfile

Obviously, you'd have to change the path to be wherever you're running the test 
suite from.

The watch_dir script sits there looking for file activity, then takes and 
releases a delete-share handle on the file. It's enough to disrupt certain 
tests (such as test_zipfile) pretty much every time. Other tests are affected 
less, or only the first few times. Not sure why, but it's certainly enough to 
reproduce the general effect of TortoiseSVN or indexer or virus checker.

----------
Added file: http://bugs.python.org/file16839/watch_dir.py

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue7443>
_______________________________________
import os, sys

import winerror
import win32file
import win32con

if __name__ == '__main__':
  path_to_watch = sys.argv[1]
  hDir = win32file.CreateFile (
    path_to_watch,
    1, # FILE_LIST_DIRECTORY
    win32con.FILE_SHARE_READ | win32con.FILE_SHARE_WRITE,
    None,
    win32con.OPEN_EXISTING,
    win32con.FILE_FLAG_BACKUP_SEMANTICS,
    None
  )
  print "=> Watching", path_to_watch

  watching = set ()
  handles = []
  try:
    while 1:
      results = win32file.ReadDirectoryChangesW (
        hDir, 1024, True,
        win32con.FILE_NOTIFY_CHANGE_FILE_NAME,
        None, None
      )
      for action, filename in results:
        filename = os.path.join (path_to_watch, filename)
        if action == 1 and filename not in watching:
          try:
            handle = win32file.CreateFile (
              filename,
              0, win32file.FILE_SHARE_DELETE,
              None, win32file.OPEN_EXISTING, 0, 0
            )
            handles.append (handle)
          except win32file.error, (errno, module, message):
            if errno == winerror.ERROR_SHARING_VIOLATION:
              print ".. Can't hold", repr (filename)
            else:
              print ".. Problem with %r: %s" % (filename, message)
          else:
            watching.add (filename)
            print ".. Holding", repr (filename)
            handle.Close ()
            handles.remove (handle)
            watching.discard (filename)
            print ".. Released", repr (filename)

  finally:
    for handle in handles:
      handle.Close ()

  hDir.Close ()
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to