文件监控

文件监控有几种方法: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;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值