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