ReadDirectoryChangesW
ReadDirectoryChangesW函数,这个函数不仅能够监测到文件系统的变化,还能够返回详细的文件变动的信息,并且能够选择是使用同步方式检测还是异步方式监测,比较全面,但是这个函数的使用比较复杂,而且有一些需要注意的地方,把我这几天使用的心得记录一下吧,参考了MSDN以及老外的一些文档!
首先是ReadDirectoryChangesW这个函数只在WinNT中能够使用,是新加的一个API函数,所以在VC++中使用该函数的时候需要在stdafx.h的#include <afxwin.h>的前面添加 #define _WIN32_WINNT 0x0500,实现的时候应该这样
#if(_WIN32_WINNT >= 0x0400)
WINBASEAPI
BOOL
WINAPI
ReadDirectoryChangesW(
HANDLE hDirectory,
LPVOID lpBuffer,
DWORD nBufferLength,
BOOL bWatchSubtree,
DWORD dwNotifyFilter,
LPDWORD lpBytesReturned,
LPOVERLAPPED lpOverlapped,
LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
#endif /* _WIN32_WINNT >= 0x0400 */
WINBASEAPI
否则会出现编译错误的情况!delphi里使用的时候不用注意这些问题!
其次,在文件系统更新很快,很频繁的时候,这个函数会出现漏掉监控信息的情况,这个原因在MSDN里有提到,MSDN里是这么说的:当你第一次调用ReadDirectoryChangesW这个函数的时候,系统会分配一些缓存来存储文件变化信息,这些缓存与要监控的文件夹关联,直到他关闭,并且这些缓存的大小在其生存期间不会改变,调用该函数的时候,文件的变化信息不断添加到这些缓存中,如果缓存溢出,这些改变信息会丢失,函数返回error_notify_enum_dir的错误。老外写了个类,据说解决了这个问题,我没有测试过,大家可以自己去看看!http://www.codeproject.com/file/directorychangewatcher.asp