[python-win32] reliability issues with ReadDirectoryChangesW

Eric Blade blade.eric at gmail.com
Sat Feb 7 23:48:27 CET 2009


I am getting significantly unreliable results using
ReadDirectoryChangesW, attempting to use a simplified version of the
codes that had been presented to me in my last query for help..

It's kind of messy, but here's the relevant bits of code..

                if os.name == 'nt':
                    self.filehandlelist[site] = {}
                    self.filehandlelist[site]['dir'] = dir
                    self.filehandlelist[site]['handle'] =
win32file.CreateFile(dir, 0x0001, win32con.FILE_SHARE_READ |
win32con.FILE_SHARE_WRITE, None, win32con.OPEN_EXISTING,
win32con.FILE_FLAG_BACKUP_SEMANTICS | win32con.FILE_FLAG_OVERLAPPED,
None)
                    self.filehandlelist[site]['overlap'] =
pywintypes.OVERLAPPED()
                    self.filehandlelist[site]['overlap'].hEvent =
win32event.CreateEvent(None, 0, 0, None)
                    self.filehandlelist[site]['buffer'] =
win32file.AllocateReadBuffer(1024)
                    print "Add to filehandlelist: ", self.filehandlelist[site]


....

       if os.name == 'nt':
            for handle in self.filehandlelist:
                # print "check folder ", self.filehandlelist[handle]
                results =
win32file.ReadDirectoryChangesW(self.filehandlelist[handle]['handle'],
self.filehandlelist[handle]['buffer'], True,
win32con.FILE_NOTIFY_CHANGE_FILE_NAME |
     win32con.FILE_NOTIFY_CHANGE_DIR_NAME |
     win32con.FILE_NOTIFY_CHANGE_ATTRIBUTES |
     win32con.FILE_NOTIFY_CHANGE_SIZE |
     win32con.FILE_NOTIFY_CHANGE_LAST_WRITE |
     win32con.FILE_NOTIFY_CHANGE_SECURITY,
self.filehandlelist[handle]['overlap'])

                if
win32event.WaitForSingleObject(self.filehandlelist[handle]['overlap'].hEvent,
100) == win32event.WAIT_OBJECT_0:
                    numbytes =
win32file.GetOverlappedResult(self.filehandlelist[handle]['handle'],
self.filehandlelist[handle]['overlap'], False)

win32event.ResetEvent(self.filehandlelist[handle]['overlap'].hEvent)
                    if numbytes == 0:
                        continue

                    for action, file in
win32file.FILE_NOTIFY_INFORMATION(self.filehandlelist[handle]['buffer'],
numbytes):
                        full_filename =
os.path.join(self.filehandlelist[handle]['dir'], file)
                        print "file ", full_filename, "updated action ", action
                        if full_filename not in self.filelist:
                            self.addImportFile(full_filename, site)
                        if action == 1 or action == 3: # created or updated
                            self.import_file_dict(full_filename,
self.filelist[full_filename][0], self.filelist[full_filename][1])
                        elif action == 2: # file deleted
                            del self.filelist[full_filename]


... it feels like i'm doing something wrong here, but for the life of
me, i can't seem to pinpoint it.
-- 
Cheers,
 - Eric


More information about the python-win32 mailing list