[python-win32] win32file.ReadDirectoryChangesW Missing some events even with high heap size?

Mark Mark at twitchstudios.com
Thu Feb 15 10:30:11 CET 2007


Hello,  I have recently written a tool that heavily depends on 
win32file.ReadDirectoryChangesW.

Firstly, It fires potentially hundreds of notifications for a simple 
save operation. And for a windows copy operation it fires virtually no 
resaults untill near the end of the copy.  Point being it was very hard 
for me to determine when actual write operations had finished due to all 
these sporadic events.

1. My first Dilema was trying to work out a way to consider all these 
events as just 1 event.  Is there a flag for this? I ended up writing 
some special filters to filter out all the extra events that follow an 
initial event up untill some condition is met. but I'm wondering if 
there is an easy way to determine when a write operation has actually 
finished? or when a write operation first STARTS. Nothing more.

2. Secondly and more importantly.   Events go missing.  Sometimes i get 
a 'file deleted' event followed by a 'file created' event when i save a 
file, but sometimes i just get a 'file created' event with no 'file 
deleted' event preceding it. Both times i saved the file in exactly the 
same way.  And it appears to be very random when it chooses to skip out 
on not reporting the 'file deleted' event. 

Any ideas as to why some events appear to go missing?  Is 
"ReadDirectoryChangesW " prone to inaccuracy's.  I have tried having 
rather large heap sizes and that does not appear to help.  If 
ReadDirectoryChanges is solid acoording to you guys then i will just 
have to keep trawling through my code to see if its something else.

Here are some snippets from it to show you how i have set up the 
directory watching parameters.

hDir = win32file.CreateFile (
  path_to_watch,
  FILE_LIST_DIRECTORY,
  win32con.FILE_SHARE_READ | win32con.FILE_SHARE_WRITE,
  None,
  win32con.OPEN_EXISTING,
  win32con.FILE_FLAG_BACKUP_SEMANTICS,
  None
)

results = win32file.ReadDirectoryChangesW (
  hDir,
  10000, #Heap Size
  include_subdirectories,
  win32con.FILE_NOTIFY_CHANGE_FILE_NAME| #should return an integer of 1
  win32con.FILE_NOTIFY_CHANGE_LAST_WRITE, #should return an integer of 3
  None,
  None
)

note: there are some loops that run that constantly return the resaults 
of ReadDirectoryChangesW.

i based my code off tim goldens multithreaded directory watcher demo 
found at. (not much difference)
http://tgolden.sc.sabren.com/python/downloads/watch_directory.py

Im going to have an awesome tool once this is done that i hope to share.
Thanks for any insights.

Mark






More information about the Python-win32 mailing list