您的位置:首页 > 运维架构

监控目录文件变化的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 返回类型:

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,并且把自己分配的用来存放目录变化通知的内存首地址、内存长度、目录句柄传给该函数。用户代码在该函数的调用中进行同步等待。当目录中有文件发生改变,控制函数把目录变化通知存放在指定的内存区域内,并把发生改变的文件名、文件所在目录和改变通知处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息