[C++]监控特定文件夹的事件:三种解决方法汇总

王朝vc·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

监控特定文件夹的事件:三种解决方法汇总

LDBIVR程序中要监视特定文件夹的文件落地或者删除事件,本来要用SHELL中的事件通知机制,后来因为要考虑到各种意外事件,如服务意外退出、服务器崩溃等,遂作罢。

对于目录事件异步通知,大致有三个方法:

调用Windows的api函数ReadDirectoryChanges监视指定目录中文件(推荐使用),这个使用异步IO:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/readdirectorychangesw.asp

The ReadDirectoryChangesW function retrieves information that describes the changes within a directory.

To track changes on a volume, see change journals.

BOOL ReadDirectoryChangesW(

HANDLE hDirectory,

LPVOID lpBuffer,

DWORD nBufferLength,

BOOL bWatchSubtree,

DWORD dwNotifyFilter,

LPDWORD lpBytesReturned,

LPOVERLAPPED lpOverlapped,

LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine

);

或者用SHChangeNotifyRegister和SHChangeNotifyDeregister来注册事件SHChangeNotify:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shchangenotify.asp

SHChangeNotify Function

Notifies the system of an event that an application has performed. An application should use this function if it performs an action that may affect the Shell.

Syntax

void SHChangeNotify(

LONG wEventId,

UINT uFlags,

LPCVOID dwItem1,

LPCVOID dwItem2

);

这个SHELL事件,有人这么介绍(http://qk.5nx.com/article_view.asp?id=11)。

或者调用API函数-FindFirstChangeNotification 、FindCloseChangeNotification、FindNextChangeNotification 和WaitForSingleObject :

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/findfirstchangenotification.asp

FindFirstChangeNotification

The FindFirstChangeNotification function creates a change notification handle and sets up initial change notification filter conditions. A wait on a notification handle succeeds when a change matching the filter conditions occurs in the specified directory or subtree. However, the function does not indicate the change that satisfied the wait condition.

To retrieve information about the specific change as part of the notification, use the ReadDirectoryChangesW function.

HANDLE FindFirstChangeNotification(

LPCTSTR lpPathName,

BOOL bWatchSubtree,

DWORD dwNotifyFilter

);

著名的FileMon工具用的是虚拟驱动。

相关资源:

1:《监视程序的编制》;

2:《Win32中的目录监控》;

3:《change journals》;

4:《CDirectoryChangeWatcher - ReadDirectoryChangesW all wrapped up》;

5:《监测目录活动》;

6:《请问如何监视系统对文件的访问?》。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航