3

这是问题所在:我使用 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 回答 1

4

您应该捕获FILE_NOTIFY_CHANGE_LAST_WRITE,而不是FILE_NOTIFY_CHANGE_SIZE,以获取修改后的文件。可以修改文件而不改变大小。

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

ReadDirectoryChanges不是最友好的 winapi 函数之一。您可能无法在文件创建时收到两个事件;我不完全确定您是否会FILE_NOTIFY_CHANGE_LAST_WRITE在创建时获得额外的修改,但我认为您可能会。如果它与创建事件具有相同的时间戳,则使用队列方法将允许您轻松地丢弃额外的事件。

于 2010-10-20T23:33:29.663 回答