需要一种有效的方法来处理 C++ 中的 ReadDirectoryChangesW

Posted

技术标签:

【中文标题】需要一种有效的方法来处理 C++ 中的 ReadDirectoryChangesW【英文标题】:Need an efficient way to handle ReadDirectoryChangesW in C++ 【发布时间】:2014-03-26 12:20:18 【问题描述】:

我想收到有关目录更改的通知(新文件添加/删除/更新)。 我使用了一个 API - “ReadDirectoryChangesW”,它可以正确通知目录中的任何更改。但是,API 接受一个缓冲区,其中返回目录中添加/删除/修改的文件的详细信息。 这构成了一个限制,因为目录中的更改不确定,有时可能很大。例如:目录中添加了 1000 个文件。 在这种情况下,我总是需要准备好足够大的缓冲区来保存所有 1000 个文件的通知。

我不想总是创建这个大缓冲区。 还有其他更有效的替代方法吗?

【问题讨论】:

【参考方案1】:

如果我正确阅读了文档,它将返回尽可能多的更改以适合您的缓冲区,然后当您下次调用时,它将为您提供更多更改。如果想一次获得 1000 个文件的更改,您必须给它一个大缓冲区,但如果您可以以较小的块处理它们,只需传入一个较小的缓冲区,您将获得其余的更改后续调用。

【讨论】:

【参考方案2】:

您可以使用的一种方法是使用 ReadDirectoryChangesW() 来通知目录中发生了一些更改,然后将此通知用作查看目录更改的事件。

我们的想法是发现自己发生了什么变化,而不是依靠 ReadDirectoryChangesW() 告诉你发生了什么变化。

documentation for the function 表示分配了一个系统缓冲区来跟踪更改,并且有可能分配的缓冲区会溢出大量更改。这会导致返回错误,并且需要您自己发现发生了什么变化。

这个article on using ReadDirectoryChangesW() 可以帮助你。

在我的例子中,我正在使用该功能来监视打印后台处理程序文件夹,其中可能会放置许多文本文件。文件数量很少,所以我刚刚分配了一个大缓冲区。然后我要做的是使用队列来提供实际的打印功能,该功能在另一个线程上运行,即要打印的文件列表。

【讨论】:

以上是关于需要一种有效的方法来处理 C++ 中的 ReadDirectoryChangesW的主要内容,如果未能解决你的问题,请参考以下文章

有没有一种最有效的方法来读取/写入C#中的10GB二进制文件?

如何有效地将大字符串从 Python 传递到 C++ 扩展方法?

如何有效处理 Teamcenter ITK C++ 代码中的错误 [关闭]

在 Python 中,是不是有一种方便的方法来重载 C++ 中的方法? [复制]

armadillo c++:将矩阵的每一行乘以向量的有效而简洁的方法?

深入理解C++中的异常处理机制