我是靠谱客的博主 甜美镜子,最近开发中收集的这篇文章主要介绍文件监控,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

 

 

最后

以上就是甜美镜子为你收集整理的文件监控的全部内容,希望文章能够帮你解决文件监控所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部