我一直在尝试让ReadDirectoryChangesW监控子树中的文件更改,但我发现得到的结果不一致。下面是一个自包含的测试用例,它说明了这个问题。当我运行此命令时,有时会产生以下结果:
A : Created
C : Updated
A : Deleted另一次它可能会产生:
A : Created
B : Updated
C : Updated
A : Deleted我创建了一个巨大的缓冲区,被更改的文件数量非常少(3个文件)。
代码:
import os, sys, time, threading
import win32file, win32event, win32con, pywintypes
class ChangeFiles ( threading.Thread ) :
def run( self ) :
files = [ 'A', 'B', 'C' ]
time.sleep( 1 )
for path in files : f = open( path, 'w' ); f.write( 'mooo' ); f.close()
time.sleep( 0.5 )
for path in files : os.remove( path )
ChangeFiles().start()
FILE_LIST_DIRECTORY = 0x0001
handle = win32file.CreateFile (
'.',
FILE_LIST_DIRECTORY,
win32con.FILE_SHARE_READ | win32con.FILE_SHARE_WRITE | win32con.FILE_SHARE_DELETE,
None,
win32con.OPEN_EXISTING,
win32con.FILE_FLAG_BACKUP_SEMANTICS | win32file.FILE_FLAG_OVERLAPPED,
None
)
buffer = win32file.AllocateReadBuffer( 1024 * 64 )
overlapped = pywintypes.OVERLAPPED()
overlapped.hEvent = win32event.CreateEvent( None, 0, 0, None )
readFlags = 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
ACTIONS = { 1 : "Created", 2 : "Deleted", 3 : "Updated" }
while 1 :
win32file.ReadDirectoryChangesW( handle, buffer, False, readFlags, overlapped )
rc = win32event.WaitForSingleObject( overlapped.hEvent, 200 )
if rc == win32event.WAIT_OBJECT_0 :
nbytes = win32file.GetOverlappedResult( handle, overlapped, True )
if nbytes > 0 :
for action, file in win32file.FILE_NOTIFY_INFORMATION( buffer, nbytes ) :
print '%s : %s' % ( file, ACTIONS.get ( action, "Unknown" ) )
else :
print 'no bytes'
break
elif rc < 0 :
print 'Error: %d' % win32api.GetLastError()
break发布于 2016-11-01 22:43:44
这里的问题是,您传递给WaitForSingleObject的超时时间非常低,因此在您收到事件通知之前,函数往往会超时。您的代码不会检查该条件,因此您看不到任何输出(也可以尝试测试rc > 0 )。
您可以通过向WaitForObject传递INFINITE的值(即0xFFFFFFFFF)来修复此问题。
https://stackoverflow.com/questions/14176036
复制相似问题