mobile上监控文件的操作-SHChangeNotifyRegister

 如何实现文件监控?
         首先要在窗口注册,这个要用到SHChangeNotifyRegister,这个函数的主要功能就是列举一个窗口来接收change notifications.
         在这个注册的窗口中,响应WM_FILECHANGEINFO这个消息,来进行我们响应的操作。
         如何我们不想监控了,则可以使用SHChangeNotifyDeregister,来移除相应的注册窗口。

这样我们就可以实现对一个文件夹内文件的生成,删除,改名等等操作的监控。

下面我们再具体来谈谈每一步如何操作。
1、SHChangeNotifyRegister的运用
   SHChangeNotifyRegister的原型为
  BOOL WINAPI SHChangeNotifyRegister(

HWND hwnd,

SHCHANGENOTIFYENTRY * pshcne

);

  其中,hwnd,为接收change notification的窗口;

pshcne是一个指向SHCHANGENOTIFYENTRY结构的指针,它用来指明窗口接收的change notification的类型.如果设为NULL,窗口将接收all file system, network 和 media类型的notifications.

SHCHANGENOTIFYENTRY是什么样的一个结构,我们看一下它的定义

typedef  struct  tagSHCHANGENOTIFYENTRY {   DWORD dwEventMask;   LPTSTR pszWatchDir; BOOL fRecursive;} SHCHANGENOTIFYENTRY;

dwEventMask 指定发生什么时间来发送notification 消息

pszWatchDir 指定监控路径,该值为NULL的情况下,是监控所有的文件。

fRecursive指定是否只监控指定路径还是监控指定路径及其子文件夹。

知道了这些,我们不妨写一个这样的函数,来启动文件监控。

代码如下:

BOOL StartFileMonitor(HWND hWnd, LPTSTR lpFilePath)

{

     SHCHANGENOTIFYENTRY schneNotifyEntry;

     schneNotifyEntry.dwEventMask = SHCNE_ALLEVENTS;

     schneNotifyEntry.pszWatchDir = lpFilePath;

     schneNotifyEntry.fRecursive = TRUE;

 

     return SHChangeNotifyRegister(hWnd, &schneNotifyEntry);

}

2、如何处理WM_FILECHANGEINFO消息

WM_FILECHANGEINFO 中的参数lParam,指向FILECHANGENOTIFY,含有相关的数据。所以我们在收到该消息后,先作的一部操作就是

FILECHANGENOTIFY *lpfcn = (FILECHANGENOTIFY*)lParam;

FILECHANGENOTIFY的结构为:

typedef struct tagFILECHANGENOTIFY {

 DWORD dwRefCount;

 FILECHANGEINFO fci;

} FILECHANGENOTIFY;

我们主要用到了其中的fci参数。

FILECHANGEINFO的结构为:

struct _FILECHANGEINFO {

 DWORD cbSize;

 LONG wEventId;

 ULONG uFlags;

 DWORD dwItem1;

 DWORD dwItem2;

 DWORD dwAttributes;

 FILETIME ftModified;

 ULONG nFileSize;

} FILECHANGEINFO, *LPFILECHANGEINFO;

dwEventId 与SHCHANGENOTIFYENTRY结构中的dwEventMask对应。

dwItem1,dwItem2是事件依赖的值,里面包括了我们需要的文件的完整路径。如果是进行创建文件的操作,则dwItem1是创建后文件的完整路径,如果是对文件进行重新命名操作的话,则dwItem2是修改后文件的完整路径。此处对其他参数不做介绍,大家需要的话,可以查看一下。

我们做完相应的操作后,要知道释放,此时要用到SHChangeNotifyFree。这个用起来就简单很多,如SHChangeNotifyFree(lpfcn)。

下面给大家一小段示例代码,如下

case WM_FILECHANGEINFO:

     {  

FILECHANGENOTIFY    *lpfcn;

          FILECHANGEINFO        *lpfci;   

lpfcn = (FILECHANGENOTIFY *)lParam;

         if (NULL == lpfcn)

         {

             break;

         }

         // see if the pointer to the file change info structure

         lpfci = &(lpfcn->fci);

         if (NULL == lpfci)

         {

             break;

         }

           else

           {

               switch (lpfci->wEventId)

                     {

                     case SHCNE_RENAME:

                            {

                                   //……

                            }

                            break;

                     }    

           }

           SHChangeNotifyFree(lpfcn);

}

break;

3、如何停止文件监控

   停止文件监控比较简单,只要使该窗口不接收WM_FILECHANGEINFO消息即可。使用SHChangeNotifyDeregister(hWnd)即可。

以上是我今天学习的一些总结,此外需要注意的一个小地方,在mobile上,把一个文件从一个文件夹拷到另一个文件夹,此时响应的事件是SHCNE_CREATE,二从电脑上拷贝一个文件到mobile上,响应的消息为SHCNE_RENAME。我注意到从电脑上拷贝的话,mobile会先生成一个Temp文件夹内生成一个临时文件,然后再在我们指定的文件夹内生成一个文件。这个机制我还不是很清楚为什么。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/li_guotao/archive/2009/10/20/4702344.aspx

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值