监控目录中文件的变化---FindFirstChangeNotification

本文介绍了如何使用FindFirstChangeNotification函数在Windows系统中监控目录及文件的变化,虽然该函数无法提供详细变更信息,但为获取更详尽的变动详情,可以结合ReadDirectoryChangesW函数使用。

FindFirstChangeNotification()函数只能监控到目录或是目录中的文件发生了哪种变化,但是更详细的变化信息是不能得到的。要得到更详细的信息,可以使用ReadDirectoryChangesW()函数,下次讲解这个函数的使用方法。

使用举例:

#include "stdafx.h"


void WatchDirectory(LPTSTR lpDir) 
{
	DWORD dwWaitStatus,dwRet(0); 
   HANDLE dwChangeHandles[3]; 
   TCHAR lpDrive[4] = {0},lpFile[_MAX_FNAME] = {0},lpExt[_MAX_EXT] = {0}; 
  
   _tsplitpath(lpDir, lpDrive,NULL, lpFile, lpExt); 
   lpDrive[2] = (TCHAR)'\\'; 
   lpDrive[3] = (TCHAR)'\0'; 
    
   //分别监控文件名,路径名,文件内容的修改  
   dwChangeHandles[0] = FindFirstChangeNotification(  
      lpDir,                        
      TRUE,                        
     FILE_NOTIFY_CHANGE_FILE_NAME); //文件名    
   if (dwChangeHandles[0] == INVALID_HANDLE_VALUE){
	  ExitProcess(GetLastError());
   }
    
   dwChangeHandles[1] = FindFirstChangeNotification(  
      lpDrive,                    
      TRUE, 
     FILE_NOTIFY_CHANGE_DIR_NAME); //路径名   
   if (dwChangeHandles[1] == INVALID_HANDLE_VALUE){
	   ExitProcess(GetLastError());
   }
    
   dwChangeHandles[2] = FindFirstChangeNotification(  
      lpDir, 
      TRUE, 
     FILE_NOTIFY_CHANGE_LAST_WRITE); //文件内容/或者说最后保存时间   
   if (dwChangeHandles[2] == INVALID_HANDLE_VALUE){
	   ExitProcess(GetLastError());
   }
                   
   //改变通知已经设置完成,现在只需等待这些通知被触发,然后做相应处理 
   while (TRUE)  
   {  
        dwWaitStatus= WaitForMultipleObjects(3, dwChangeHandles, FALSE, INFINITE);   
             
        switch(dwWaitStatus) 
        { 
			case WAIT_OBJECT_0:  
			printf("文件名发生了改变!\n");
			if(FindNextChangeNotification(dwChangeHandles[0]) == FALSE ){
				ExitProcess(GetLastError());
			}
			break; 

			case WAIT_OBJECT_0 + 1: 
			printf("目录名发生了改变!\n");
			if(FindNextChangeNotification(dwChangeHandles[1]) == FALSE){
				ExitProcess(GetLastError());
			}          
			break;

			case WAIT_OBJECT_0 + 2: 
			printf("最后保存时间发生了改变!\n");
			if(FindNextChangeNotification(dwChangeHandles[2]) == FALSE){
				ExitProcess(GetLastError());
			}
			break;      
			default: 
				ExitProcess(GetLastError());
				break;
        } 
   } 

	_endthread();
}

void MonitorThread(void* arg)
{
	WatchDirectory("D:\\Data");
}

int _tmain(int argc, _TCHAR* argv[])
{
	_beginthread(MonitorThread,10240,NULL);

	while (TRUE)
	{
		Sleep(1000);
	}

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小米的修行之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值