c++ - 如何在获取事件后延迟 1s 复制文件?

标签 c++ windows file winapi download

我正在从某个第三方服务器下载文件,我们无法为每个文件获取下载完成事件(至少从服务器)。大约有 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 秒。但是在那一秒内,如果我收到另一个通知,我需要再等待 1s。

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

现在我可以使用哪种数据结构来跟踪 1 秒,如果在此期间发生另一个事件,它应该以 1 秒重新启动?最初,我想到了优先级队列,但我们需要每 10 毫秒检查一次是否发生超时。另外,如果有多个元素加入到优先级队列中,也会出现问题,可能会导致重新拷贝文件。

也许我处理这个问题的方式是完全荒谬的。我愿意接受更好的方法。

最佳答案

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

关于c++ - 如何在获取事件后延迟 1s 复制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47565381/

相关文章:

windows - 获取邻居图像像素坐标

python - 在 python 中写入空列

c++ - 模板类链表插入错误

c++ - 如何搜索确切的单词?

c++ - 内联变量仿真 : can I use global static references to enforce the initialization order of static variable in functions?

css - 使 Google Chrome 中的字体更清晰、更锐利

mysql - 监控命令行操作的进度

python - 在C中查看日志文件

python - Python 和 Matlab 之间的共享文件访问

c++ - 多态 C++ 引用