文件夹监控源码(API函数ReadDirectoryChangesW 监视目录)

对指定的一个目录进行监控,当该目录中有文件发生改变,并通知处理。 Windows提供了对文件和目录监控的系统服务,并且为应用程序提供了两个API函数,它们分别是:FindFirstChangeNotification和ReadDirectoryChangesW。由于通过FindFirstChangeNotification函数只能监控到某一目录下有文件发生改变,而不能监控到具体是哪一文件发生改变,所以本人选用ReadDirectoryChangesW函数。该函数的定义为:

.DLL命令 文件夹监控, 逻辑型, , “ReadDirectoryChangesW” .参数 目录句柄, 整数型, , 通过获取目录命令或得的句柄 .参数 返回信息指针, FILE_NOTIFY_INFORMATION, 传址 .参数 内存长度, 整数型 .参数 监控类型, 逻辑型 .参数 过滤器, 整数型 .参数 内存大小, 整数型 .参数 异步使用, OVERLAPPED, 传址, 一个OVERLAPPED结构指针,给异使用,其他为NULL .参数 操作状态, 整数型, , 完成或取消时,指针指向完成程序.DLL命令 获取目录句柄, 整数型, “kernel32”, “CreateFileA”, , 用来返回目录句柄 .参数 目录地址, 文本型 .参数 访问权限, 整数型, , 1+1073741824,读访问和写访问 .参数 共享权限, 整数型 .参数 安全特性, 整数型 .参数 文件特性, 整数型, , 文件一定要存在 .参数 标记属性, 整数型, , 标记属性,允许您去开启一个目录,并允许您改变目录的属性 .参数 复制属性, 整数型

第一个参数是要监控目录的句柄,可以通过指定目录名,利用CreateFile函数的返回值获得。用户代码通过第二个和第三个参数来告知操作系统该把目录变化通知放在首地址为返回信息指针, 一块内存长度区域当中的。但是该内存又是怎样组织的呢?操作系统是把他们放在FILE_NOTIFY_INFORMATION这个结构里面的:

.数据类型 FILE_NOTIFY_INFORMATION .成员 NextEntryOffset, 整数型 .成员 Action, 整数型 .成员 FileNameLength, 整数型 .成员 FileName, 字节型, , “1024”

  这是一个自定义结构,第一个字段存储了要获得下一个记录需要跳过多少字节数,如果它的值为0,就表示本记录已经是最后一条记录了。该字段其实也可以看作是一个指向下一条记录的指针。第二个字段的含义是:本次通知了哪种类型的目录变化。第三个字段表示的是变化的文件名称的长度。第四个字段是一个存放变化的文件名称的Unicode字符数组的首地址。

  另外一个与本系统有关的参数是类型过滤器。它是目录变化通知过滤器。要监控文件名发生变化,此参数应设为FILE_NOTIFY_CHANGE_FILE_NAME;文件被非法改写为FILE_NOTIFY_CHANGE_LAST_WRITE等等。根据过滤器的设置,ReadDirectoryChangesW函数可以监控文件名改变、文件属性改变、文件大小改变、文件内容被改写、文件被删除等多种类型的变化。

  利用ReadDirectoryChangesW函数实现对一个目录进行监控的。具体的做法是:首先使用CreateFile获取要监控目录的句柄;然后在一个判断循环里面调用ReadDirectoryChangesW,并且把自己分配的用来存放目录变化通知的内存首地址、内存长度、目录句柄传给该函数。用户代码在该函数的调用中进行同步等待。当目录中有文件发生改变,控制函数把目录变化通知存放在指定的内存区域内,,并把发生改变的文件名、文件所在目录和改变通知处理。’转载请注明出自外挂海官方论坛,本贴地址:

世上并没有用来鼓励工作努力的赏赐,所有的赏赐都只是被用来奖励工作成果的。

文件夹监控源码(API函数ReadDirectoryChangesW 监视目录)

相关文章:

你感兴趣的文章:

标签云: