我正在从某个第三方服务器下载文件,我们无法为每个文件获取下载完成事件(至少从服务器)。大约有 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/