文件监控有几种方法:FindFirstChangeNotification,ReadDirectoryChangesW,SHChangeNotifyRegister。
Find那个只能监控到文件有变动,但是进一步的信息就没有了,Read好多参数啊,所以我尝试一下用Shell API。
Shell在WM和PC下是两种不同的方法,WM下的参数比较简单,一个hwnd用来接受消息,一个SHCHANGENOTIFYENTRY,这个结构也比较简单,就是设置一些需要监控什么消息,监控路径,是否监控子文件夹。
相对而言PC下的就比较复杂了
ULONG SHChangeNotifyRegister(
HWND hwnd,
int fSources,
LONG fEvents,
UINT wMsg,
int cEntries,
SHChangeNotifyEntry *pfsne );
返回值:
一个ID,用于SHChangeNotifyDeregister使用来释放监控
参数:
hwnd,用来接受消息的窗口句柄
fSources,One or more of the following values that indicate the type of events for which to receive notifications:
SHCNRF_InterruptLevel等,不过这些都没有定义,需要自己定义的
fEvents,SHCNE_ALLEVENTS等
wMsg,自定义的消息,当文件有修改时,会向窗口传送这个消息
pfsne,结构体
下面是使用例子:
SHChangeNotifyEntry sn = {0};
sn.fRecursive = TRUE;
sn.pidl = 0;
m_nNotify = SHChangeNotifyRegister( m_hWnd, SHCNRF_InterruptLevel|SHCNRF_ShellLevel,SHCNE_ALLEVENTS, WM_FILE_CHANGE, 1, &sn );
// 当发生变化时,在OnFileChange中处理
LRESULT CNetDlg::OnFileChange( WPARAM wParam, LPARAM lParam )
{
SHNotifyInfo* pShellInfo = (SHNotifyInfo*)wParam;
TCHAR szSrc[MAX_PATH] = {0};
TCHAR szDes[MAX_PATH] = {0};
// 原文件路径
SHGetPathFromIDList( (LPCITEMIDLIST)pShellInfo->dwItem1, szSrc );
// 目标文件路径
SHGetPathFromIDList( (LPCITEMIDLIST)pShellInfo->dwItem2, szDes );
switch(lParam)
{
case SHCNE_CREATE:
break;
}
return S_OK;
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Jonason123/archive/2010/01/23/5224068.aspx/
http://blog.csdn.net/longshengzi/archive/2009/12/13/4975574.aspx