我想监视指定目录中的修改,并检索确切的更改信息。所以我决定使用ReadDirectoryChangesW()函数。但我想异步使用它,这意味着如果目录中没有任何更改,我不希望我的工作线程被阻止。我怎么能这样做?
谢谢!
答案 0 :(得分:3)
我倾向于将ReadDirectoryChangesW()与I / O完成端口一起使用,这对于监视多个目录很有用,因为您可以让一个线程为IOCP提供服务并处理所有调用的结果ReadDirectoryChangesW()。
首先通过调用CreateIoCompletionPort()创建一次IOCP。启动一个调用GetQueuedCompletionStatus()的线程,并处理异步目录更改。
现在为您要监控的每个目录。首先正常打开目录句柄。接下来,通过调用CreateIoCompletionPort()并传入IOCP句柄将其与IOCP相关联(有关更多详细信息,请参阅文档)。最后调用ReadDirectoryChangesW()并传递文档中详述的OVERLAPPED。调用将返回,如果成功,结果将作为GetQueuedCompletionStatus()的结果提供给您为IOCP服务而创建的线程。
答案 1 :(得分:1)
来自MSDN documentation for ReadDirectoryChnagesW():
对于异步完成,您可以在其中一个中接收通知 三种方式:
- 使用GetOverlappedResult函数。接收通知 通过GetOverlappedResult,不要 指定一个完成例程 lpCompletionRoutine参数。确定 设置hEvent成员 OVERLAPPED结构独特 事件
- 使用GetQueuedCompletionStatus函数。至 收到通知 GetQueuedCompletionStatus,不要 指定一个完成例程 用lpCompletionRoutine。关联 目录句柄hDirectory用 通过调用完成端口 CreateIoCompletionPort函数。
- 使用完成例程。通过收到通知 完成例程,不要关联 具有完成端口的目录。 在中指定完成例程 用lpCompletionRoutine。这个例程是 只要操作已经被调用 线程完成或取消 处于警报等待状态。该 重叠的成员OVERLAPPED 系统不使用结构, 所以你可以自己使用它。