要监视指定目录中的变化可以使用FindFirstChangeNotification 函数。此函数创建一个改
变通知对象,设置初始的改变通知过滤条件。在指定的目录或子目录下,当一个符合过滤条件
HANDLE FindFirstChangeNotification(
LPCTSTR lpPathName, // 指定要监视的目录
BOOL bWatchSubtree, // 指定是否监视lpPathName 目录下的所有子目录
DWORD dwNotifyFilter // 指定过滤条件
可以是以下值的组合:
FILE_NOTIFY_CHANGE_FILE_NAME 要求监视文件名称的改变
FILE_NOTIFY_CHANGE_DIR_NAME 要求监视目录名称的改变
FILE_NOTIFY_CHANGE_ATTRIBUTES 要求监视属性的改变
FILE_NOTIFY_CHANGE_SIZE 要求监视文件大小的改变
FILE_NOTIFY_CHANGE_LAST_WRITE 要求监视最后写入时间的改变
FILE_NOTIFY_CHANGE_SECURITY 要求监视安全属性的改变
函数执行成功返回值是改变通知对象句柄,INVALID_HANDLE_VALUE 是失败后的返回
值。返回的句柄可传递给等待函数(如WaitForSingleObject 等)。当监视的目录或子目录中一
个过滤条件满足的时候,等待就会返回。
等待函数返回之后,应用程序可以处理这个改变,并调用FindNextChangeNotification 函
数继续监视目录。当不再使用这个句柄时,应当调用FindCloseChangeNotification 函数关闭它。
#include<windows.h>
#include<stdio.h>
#include<conio.h>
void main()
{
//监视C盘根目录下文件名改变的例子,其中while循环一直监控,知道程序关闭
HANDLE hChangeHandle=FindFirstChangeNotification("C:\\",false,FILE_NOTIFY_CHANGE_FILE_NAME);
//判断是否设置成功
if(hChangeHandle==INVALID_HANDLE_VALUE)
{
printf("Find First Change Notification failed\n");
return ;
}
//等待通知
if(WaitForSingleObject(hChangeHandle,-1)==0)
{
printf("These change a file name\n");
}
//循环等待
while(true)
{
if(FindNextChangeNotification(hChangeHandle))
{
if(WaitForSingleObject(hChangeHandle,-1)==0)
{
printf("These change a file name\n");
}
}
}
//结束监视程序调用FindCloseChangeNotification关闭句柄
FindCloseChangeNotification(hChangeHandle);
//按键退出程序
getch();
}
变通知对象,设置初始的改变通知过滤条件。在指定的目录或子目录下,当一个符合过滤条件
的改变发生时,一个在通知句柄上的等待将会成功(等待函数返回)。
HANDLE FindFirstChangeNotification(
LPCTSTR lpPathName, // 指定要监视的目录
BOOL bWatchSubtree, // 指定是否监视lpPathName 目录下的所有子目录
DWORD dwNotifyFilter // 指定过滤条件
);
可以是以下值的组合:
FILE_NOTIFY_CHANGE_FILE_NAME 要求监视文件名称的改变
FILE_NOTIFY_CHANGE_DIR_NAME 要求监视目录名称的改变
FILE_NOTIFY_CHANGE_ATTRIBUTES 要求监视属性的改变
FILE_NOTIFY_CHANGE_SIZE 要求监视文件大小的改变
FILE_NOTIFY_CHANGE_LAST_WRITE 要求监视最后写入时间的改变
FILE_NOTIFY_CHANGE_SECURITY 要求监视安全属性的改变
函数执行成功返回值是改变通知对象句柄,INVALID_HANDLE_VALUE 是失败后的返回
值。返回的句柄可传递给等待函数(如WaitForSingleObject 等)。当监视的目录或子目录中一
个过滤条件满足的时候,等待就会返回。
等待函数返回之后,应用程序可以处理这个改变,并调用FindNextChangeNotification 函
数继续监视目录。当不再使用这个句柄时,应当调用FindCloseChangeNotification 函数关闭它。
这两个函数的惟一参数是FindFirstChangeNotification 函数返回的句柄。
#include<windows.h>
#include<stdio.h>
#include<conio.h>
void main()
{
//监视C盘根目录下文件名改变的例子,其中while循环一直监控,知道程序关闭
HANDLE hChangeHandle=FindFirstChangeNotification("C:\\",false,FILE_NOTIFY_CHANGE_FILE_NAME);
//判断是否设置成功
if(hChangeHandle==INVALID_HANDLE_VALUE)
{
printf("Find First Change Notification failed\n");
return ;
}
//等待通知
if(WaitForSingleObject(hChangeHandle,-1)==0)
{
printf("These change a file name\n");
}
//循环等待
while(true)
{
if(FindNextChangeNotification(hChangeHandle))
{
if(WaitForSingleObject(hChangeHandle,-1)==0)
{
printf("These change a file name\n");
}
}
}
//结束监视程序调用FindCloseChangeNotification关闭句柄
FindCloseChangeNotification(hChangeHandle);
//按键退出程序
getch();
}