2

我将ReadDirectoryChangesW (Windows API) 与GetQueuedCompletionStatus结合使用。如何检测可能的缓冲区溢出以了解至少一个文件系统更改事件已丢失?

4

3 回答 3

2

异步使用时ReadDirectoryChangesW,你会得到第一组事件,然后你必须再次调用它以获得更多事件。事件多于缓冲区容量并不是错误。有更多的事件超出操作系统级缓冲区的容量是错误条件,您会发现如下:

  1. 发生了一些事件。
  2. 由 启动的异步操作ReadDirectoryChangesW成功完成。您的缓冲区已填满,您的事件句柄已设置或 IOCP 已触发。
  3. 发生其他事件,这些事件存储在操作系统级别的缓冲区中。
  4. 还会发生更多额外的事件,这些事件会溢出操作系统级别的缓冲区。这不会更改已在步骤 2 中成功的重叠操作的状态。
  5. 您等待事件句柄,或处理 IOCP,然后发现已完成的 OVERLAPPED 调用。
  6. ReadDirectoryChangesW再次调用以开始异步重叠操作,检查自步骤 2 以来发生的任何事件。 此调用同步失败,使用GetLastError() == ERROR_NOTIFY_ENUM_DIR或成功dwBytesTransferred == 0,因为文档说这也意味着重新枚举目录

如果传输的字节数为零,则缓冲区要么太大而系统无法分配,要么太小而无法提供有关目录或子树中发生的所有更改的详细信息。在这种情况下,您应该通过枚举目录或子树来计算更改。

于 2017-07-22T23:49:13.967 回答
1

您可能无法以这种方式完成检测,但这里有一个很棒的教程可能会有所帮助。

您还可以查看其他问题的答案。

于 2011-12-13T02:40:56.903 回答
0

这里来看,似乎没有异步返回这样的错误代码。

建议:同步监控更改,但在专用线程中,并注意ERROR_NOTIFY_ENUM_DIR.

于 2011-12-12T09:37:29.903 回答