文件监控

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

你可能感兴趣的:(shell,api,File,Path,events,notifications)