监控目录文件变化的ReadDirectoryChangesW 函数学习总结
2013-11-20 10:38
489 查看
客户端监控被监控目录(含所有子目录)下的变化,我们可以采用ReadDirectoryChangesW 函数 ,该函数实现对指定的目录进行监控,并且返回详细的文件变化信息。
函数原型:
BOOL WINAPI ReadDirectoryChangesW(
__in HANDLE hDirectory;
__out LPVOID lpBuffer;
__in DWORD nBufferLength;
__in BOOL bWatchSubtree; // 监视目录. 一般选择 TRUE
__in DWORD dwNotifyFilter; // 对文件过滤的方式和标准
__out_opt LPDWORD lpBytesReturned;// 将接收的字节数转入lpBuffer参数
__inout_opt LPOVERLAPPED lpOverlapped; // 一般选择 NULL
__in_opt LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine;
// 一般选择 NULL
);
1.首先该函数使用CreateFile打开目录,打开目录的时候一定要包含FILE_LIST_DIRECTORY参数,它规定了一种必需的访问权限,并返回目录的句柄。
2.lpBuffer,这个缓冲区定义的是FILE_NOTIFY_INFORMATION结构,它存储了文件或目录变化的数据。
3.dwNotifyFilter,对监控文件变化方式的过滤,可以采用以下的一种或几种的组合:
a) FILE_NOTIFY_CHANGE_FILE_NAME:任何文件名改变,都会查看所在目录或子目录的变更,并将结果通知给等待操作返回。
b) FILE_NOTIFY_CHANGE_DIR_NAME:任何目录名称改变 都会查看所在目录或子目录的变更,并将结果通知给等待操作返回。
c) FILE_NOTIFY_CHANGE_ATTRIBUTES:任何属性变化,都会查看所在目录或子目录的变更,并将结果通知给等待操作返回。
d) FILE_NOTIFY_CHANGE_SIZE:任何文件大小的变化,都会查看所在目录或子目录的变更,并将结果通知给等待操作返回。
e) FILE_NOTIFY_CHANGE_LAST_WRITE: 任何改变过去修改时间的文件 ,都会查看所在目录或子目录的变更,并将结果通知给等待操作返回。
f) FILE_NOTIFY_CHANGE_LAST_ACCESS:任何改变文件最近访问时间,都会查看所在目录或子目录的变更,并将结果通知给等待操作返回。
g) FILE_NOTIFY_CHANGE_CREATION:任何改变文件的创建时间的,都会查看所在目录或子目录的变更,并将结果通知给等待操作返回。
h) FILE_NOTIFY_CHANGE_SECURITY: 任何安全描述符被改变的,都会查看所在目录或子目录的变更,并将结果通知给等待操作返回。
完全满足我们要求监控的条目。
4.如果函数失败,返回值是零,否则是非零:
ReadDirectoryChangesW 返回类型:
根据他不同的返回值,与服务器端进行通信做出不同的同步操作。
5. 该函数具体的做法是:首先使用CreateFile获取要监控目录的句柄;然后在一个判断循环里面调用ReadDirectoryChangesW,并且把自己分配的用来存放目录变化通知的内存首地址、内存长度、目录句柄传给该函数。用户代码在该函数的调用中进行同步等待。当目录中有文件发生改变,控制函数把目录变化通知存放在指定的内存区域内,并把发生改变的文件名、文件所在目录和改变通知处理。
函数原型:
BOOL WINAPI ReadDirectoryChangesW(
__in HANDLE hDirectory;
__out LPVOID lpBuffer;
__in DWORD nBufferLength;
__in BOOL bWatchSubtree; // 监视目录. 一般选择 TRUE
__in DWORD dwNotifyFilter; // 对文件过滤的方式和标准
__out_opt LPDWORD lpBytesReturned;// 将接收的字节数转入lpBuffer参数
__inout_opt LPOVERLAPPED lpOverlapped; // 一般选择 NULL
__in_opt LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine;
// 一般选择 NULL
);
1.首先该函数使用CreateFile打开目录,打开目录的时候一定要包含FILE_LIST_DIRECTORY参数,它规定了一种必需的访问权限,并返回目录的句柄。
2.lpBuffer,这个缓冲区定义的是FILE_NOTIFY_INFORMATION结构,它存储了文件或目录变化的数据。
3.dwNotifyFilter,对监控文件变化方式的过滤,可以采用以下的一种或几种的组合:
a) FILE_NOTIFY_CHANGE_FILE_NAME:任何文件名改变,都会查看所在目录或子目录的变更,并将结果通知给等待操作返回。
b) FILE_NOTIFY_CHANGE_DIR_NAME:任何目录名称改变 都会查看所在目录或子目录的变更,并将结果通知给等待操作返回。
c) FILE_NOTIFY_CHANGE_ATTRIBUTES:任何属性变化,都会查看所在目录或子目录的变更,并将结果通知给等待操作返回。
d) FILE_NOTIFY_CHANGE_SIZE:任何文件大小的变化,都会查看所在目录或子目录的变更,并将结果通知给等待操作返回。
e) FILE_NOTIFY_CHANGE_LAST_WRITE: 任何改变过去修改时间的文件 ,都会查看所在目录或子目录的变更,并将结果通知给等待操作返回。
f) FILE_NOTIFY_CHANGE_LAST_ACCESS:任何改变文件最近访问时间,都会查看所在目录或子目录的变更,并将结果通知给等待操作返回。
g) FILE_NOTIFY_CHANGE_CREATION:任何改变文件的创建时间的,都会查看所在目录或子目录的变更,并将结果通知给等待操作返回。
h) FILE_NOTIFY_CHANGE_SECURITY: 任何安全描述符被改变的,都会查看所在目录或子目录的变更,并将结果通知给等待操作返回。
完全满足我们要求监控的条目。
4.如果函数失败,返回值是零,否则是非零:
ReadDirectoryChangesW 返回类型:
Value | Meaning |
FILE_ACTION_ADDED 0x00000001 | The file was added to the directory. |
FILE_ACTION_REMOVED 0x00000002 | The file was removed from the directory. |
FILE_ACTION_MODIFIED 0x00000003 | The file was modified. This can be a change in the time stamp or attributes. |
FILE_ACTION_RENAMED_OLD_NAME 0x00000004 | The file was renamed and this is the old name. |
FILE_ACTION_RENAMED_NEW_NAME 0x00000005 | The file was renamed and this is the new name. |
5. 该函数具体的做法是:首先使用CreateFile获取要监控目录的句柄;然后在一个判断循环里面调用ReadDirectoryChangesW,并且把自己分配的用来存放目录变化通知的内存首地址、内存长度、目录句柄传给该函数。用户代码在该函数的调用中进行同步等待。当目录中有文件发生改变,控制函数把目录变化通知存放在指定的内存区域内,并把发生改变的文件名、文件所在目录和改变通知处理。
相关文章推荐
- 可以获取客户端的IP地址的sql语句
- SharePoint 客户端对象模型 (一) ECMA Script
- Js如何判断客户端是PC还是手持设备简单分析
- 使用AjaxPro.Net框架实现在客户端调用服务端的方法
- Oracle 11g服务器与客户端卸载、安装全过程
- 利用客户端缓存对网站进行优化的原理分析第1/2页
- 由于这台计算机没有终端服务器客户端访问许可证,远程会话被中断
- asp.net 客户端浏览器缓存的Http头介绍
- 真正的获取客户端真实IP地址及利弊分析
- php 获取客户端的真实ip
- JavaScript 获取用户客户端操作系统版本
- jsp 获取客户端的浏览器和操作系统信息
- javascript 客户端验证上传图片的大小(兼容IE和火狐)
- php中获取远程客户端的真实ip地址的方法
- JavaScript打开客户端exe文件的代码
- 发布一个基于TokyoTyrant的C#客户端开源项目
- php/js获取客户端mac地址的实现代码
- ASP.NET获取真正的客户端IP地址的6种方法
- MySQL 客户端不输入用户名和密码直接连接数据库的2个方法
- Android TCP 文件客户端与服务器DEMO介绍