如何在发生事件后延迟1秒的应对文件

How to delay coping file for 1s after getting event?

本文关键字:1秒 文件 延迟 事件      更新时间:2023-10-16

我正在从某些第三方服务器下载文件,我们无法为每个文件获取下载完成事件(至少从服务器中)。大约有20个文件,一旦单个文件下载,我们就需要复制到其他位置(这需要尽可能快)。

要检查是否到达任何新文件,我正在使用ReadDirectoryChanges API。

while (ReadDirectoryChangesW(
            hDir, /* handle to directory */
            &buffer, /* read results buffer */
            sizeof(buffer), /* length of buffer */
            TRUE, /* monitoring option */
            FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_CREATION | FILE_NOTIFY_CHANGE_FILE_NAME,
            &bytesReturned, /* bytes returned */
            NULL, /* overlapped buffer */
            NULL)) /* completion routine */
{
   //do file copy after download completes
}

现在问题是我们不确定下载何时完成。我们从ReadDirectoryChanges获得了多个事件,每次写东西要提交我们都会得到一个事件。

是否有任何方法知道我们要为此获得事件的特定文件完成下载?

作为解决方法,我们决定在开始复制之前等待1秒。但是在那一秒钟内,如果我收到另一个通知,我需要等待另外1秒。

我们将在单独的线程中启动文件复制,并且可以并行进行多个文件副本。

现在我可以使用哪种数据结构跟踪1秒,如果另一个事件发生在两者之间,则应用1秒重新启动?最初,我想到了优先队列,但是我们需要检查每10毫秒是否会发生某些超时。另外,如果将多个元素添加到优先级队列,可能会导致复制文件。

也许我解决这个问题的方式是完全荒谬的。我对更好的方法开放。

收到文件的FILE_ACTION_MODIFIED事件后,请直接尝试打开文件,拒绝共享写作,但允许共享读取。只要另一个进程打开写作文件,您将无法打开它,因此请等待下一个事件。