Win32 C ++ ReadDirectoryChangesW文件差异检测的“创建”和“修改”?

时间:2010-10-20 20:07:09

标签: c++ winapi readdirectorychangesw

问题在于:我使用Win32 API ReadDirectoryChangesW函数监控目录。我需要区分新创建的文件和修改过的文件。但是有问题......一如既往:(

例:

  1. 我监视新目录/修改(FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_SIZE)。 问题:文件创建后,会触发新文件事件+修改文件事件。但我只需要一个。我怎么能避免这种情况?当文件被修改时,我得到了我想要的东西:)。
  2. 我只监控目录中的新文件(FILE_NOTIFY_CHANGE_FILE_NAME) - 没有问题。
  3. 我仅监视目录中的修改文件(FILE_NOTIFY_CHANGE_SIZE)。 问题:当新文件出现时,将触发修改操作以及文件创建事件。我怎么能避免这种情况?
  4. 当然,我实施了一些解决方法。但是,我想知道是否有任何优雅的方法来处理我所描述的问题。

    提前致谢!

1 个答案:

答案 0 :(得分:4)

对于修改后的文件,您应该抓住FILE_NOTIFY_CHANGE_LAST_WRITE,而不是FILE_NOTIFY_CHANGE_SIZE。可以在不改变大小的情况下修改文件。

您还应该保留更改队列及其发生的时间,并且仅在过去1-2秒内没有更改后处理队列。有些应用程序在创建或修改文件时可能会做一些非常奇怪的事情,如果你打算在野外使用这些代码,你很可能想要使用流行应用程序的特殊情况。

ReadDirectoryChanges不是最友好的winapi功能之一。你可能无法绕过文件创建接收两个事件;我不完全确定你是否会在创作时获得FILE_NOTIFY_CHANGE_LAST_WRITE的额外修改,但我想你可能会这样做。如果与创建事件具有相同的时间戳,则使用队列方法将允许您轻松地抛出额外事件。