需要一种在c++中有效处理ReadDirectoryChangesW的方法

Need an efficient way to handle ReadDirectoryChangesW in C++

本文关键字:有效 处理 ReadDirectoryChangesW 方法 c++ 一种      更新时间:2023-10-16

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

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

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

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

这个想法是发现你自己发生了什么变化,而不是依赖于ReadDirectoryChangesW()来告诉你发生了什么变化。

该函数的文档表明分配了一个系统缓冲区来跟踪更改,并且有可能,随着大量更改,分配的缓冲区将溢出。这将导致返回一个错误,并要求您发现自己更改了什么。

这篇关于使用ReadDirectoryChangesW()的文章可能会对您有所帮助。

在我的示例中,我使用该函数监视打印假脱机程序文件夹,其中可能会放入许多文本文件。文件的数量很少,所以我只分配了一个大的缓冲区。然后,我要做的是使用队列向实际的打印功能提供要打印的文件列表,该功能运行在另一个线程上。