【问题标题】:Win32 C++ ReadDirectoryChangesW "creation" and "modification" of file difference detect?Win32 C++ ReadDirectoryChangesW“创建”和“修改”文件差异检测?
【发布时间】:2010-10-20 20:07:09
【问题描述】:

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

案例:

  1. 我监视新/修改目录 (FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_SIZE)。 问题: 创建文件后,触发新建文件事件+修改文件事件。但我只需要一个。我怎样才能避免这种情况?当文件被修改时,我得到了我想要的:)。
  2. 我只监视新文件的目录 (FILE_NOTIFY_CHANGE_FILE_NAME) - 没问题。
  3. 我只监视目录以修改文件 (FILE_NOTIFY_CHANGE_SIZE)。 问题: 当有新文件时,修改操作会与文件创建事件一起触发。我怎样才能避免这种情况?

当然,我实施了一些解决方法。但是,我想知道是否有任何优雅的方式来处理我描述的问题。

【问题讨论】:

  • 当尺寸从 0 变为非零时忽略尺寸修改会有所帮助吗?
  • 在事件发生时我不知道文件大小,我只知道文件被改变了。
  • 目前唯一有帮助的是跳过下一个事件,方法是放置一个 1 秒的计时器并跳过它。但这是一种解决方法,而不是解决方案:)

标签: c++ winapi readdirectorychangesw


【解决方案1】:

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

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

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

【讨论】:

  • 在 FILE_NOTIFY_CHANGE_LAST_WRITE 您将收到 3 条通知 :)
猜你喜欢
  • 2012-03-09
  • 1970-01-01
  • 1970-01-01
  • 2012-11-09
  • 1970-01-01
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
  • 2010-09-23
相关资源
最近更新 更多