19 .net windows readdirectorychangesw
当有大量文件活动时,互联网上有很多关于ReadDirectoryChangesW API函数丢失文件的帖子.大多数人都指责调用ReadDirectoryChangesW函数循环的速度.这是一个不正确的假设.我看到的最好的解释是在下面的帖子,评论于2008年4月14日星期一下午2:15:27
http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/4465cafb-f4ed-434f-89d8-c85ced6ffaa8/
摘要是ReadDirectoryChangesW函数报告文件更改,因为它们离开文件后写队列,而不是添加它们.如果在提交之前添加了太多,则会忽略其中一些.如果您只是编写一个程序来快速生成目录中的1000多个文件,您可以通过实现看到这一点.只需计算您获得的文件事件通知数量,您就会看到有时您不会收到所有这些通知.
问题是,有没有人找到一种可靠的方法来使用ReadDirectoryChangesW函数而不必每次都刷新卷?如果用户不是管理员并且还可能需要一些时间来完成,则不允许这样做.
如果 API 不可靠,那么解决方法可能是您唯一的选择。这当然可能涉及跟踪上次修改时间和文件名。 这并不意味着您在查找更改时需要轮询,而是可以使用 FileSystemWatcher 作为触发检查的方法。
因此,如果您跟踪最近发生的 50-100 次 ReadDirectoryChangesW /FSW事件,并且您发现它正在被快速调用,您可以检测到这一点并触发特殊条件以获取所有已更改的文件(并设置一个标志,以在几秒钟内暂时防止未来的虚假 FSW 事件。
由于有些人对此解决方案的评论感到困惑,因此我建议您应该监视事件从 ReadDirectoryChangesW 到达的速度,当它们到达太快时,尝试尝试解决方法(通常是手动扫描目录)。