文件夹监控源码

文件夹监控源码(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,并且把自己分配的用来存放目录变化通知的内存首地址、内存长度、目录句柄传给该函数。用户代码在该函数的调用中进行同步等待。当目录中有文件发生改变,控制函数把目录变化通知存放在指定的内存区域内,并把发生改变的文件名、文件所在目录和改变通知处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爱吃饼干的熊猫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值