Winapi 如何知道文件已完成复制

Winapi 如何知道文件已完成复制,winapi,readdirectorychangesw,file-copying,Winapi,Readdirectorychangesw,File Copying,我正在使用ReadDirectoryChangesW监视一个文件夹,如果我将一个大文件复制到该文件夹,我会收到多个文件修改消息,似乎每次windows写入一大块文件时,您都会收到文件修改通知。我尝试使用CreateFile API检查文件是否可以由AP打开,但有时,某些文件总是被其他AP锁定,例如,如果您正在打开Outlook,PST将更新,但我的AP无法访问它,我们必须启动卷影复制来打开它。 因此,我的问题是,如何知道文件已完成复制?这是一个非常棘手的解决方案,但在非常棘手的情况下,您可以运行

我正在使用ReadDirectoryChangesW监视一个文件夹,如果我将一个大文件复制到该文件夹,我会收到多个文件修改消息,似乎每次windows写入一大块文件时,您都会收到文件修改通知。我尝试使用CreateFile API检查文件是否可以由AP打开,但有时,某些文件总是被其他AP锁定,例如,如果您正在打开Outlook,PST将更新,但我的AP无法访问它,我们必须启动卷影复制来打开它。
因此,我的问题是,如何知道文件已完成复制?

这是一个非常棘手的解决方案,但在非常棘手的情况下,您可以运行轮询循环来检查文件的大小或修改日期。如果文件在一段时间内没有更改,您可以安全地假定文件已完成复制


编辑:这不是一般情况下的最佳解决方案,但考虑到在OP的情况下,更好的解决方案被问题约束排除。在考虑向下投票之前,请先考虑这一点。

这是一种非常粗糙的解决方案,但在非常复杂的情况下,您可以运行轮询循环来检查文件的大小或修改日期。如果文件在一段时间内没有更改,您可以安全地假定文件已完成复制


编辑:这不是一般情况下的最佳解决方案,但考虑到在OP的情况下,更好的解决方案被问题约束排除。在考虑向下投票之前,请先考虑一下这一点。

当您对文件大小进行投票时,不要使用_stat/_stat64。相反,每次需要时打开文件并调用_filelengthi64以获取文件的大小。Windows操作系统不会实时更新由_stat64返回的文件大小。此外,通过能够打开文件,您正在测试是否已完成任何长复制操作。

当您轮询文件大小时,不要使用_stat/_stat64。相反,每次需要时打开文件并调用_filelengthi64以获取文件的大小。Windows操作系统不会实时更新由_stat64返回的文件大小。此外,通过能够打开文件,您正在测试是否已完成任何长复制操作。

Windows提供了一个API来监视目录内容更新。 您可以使用创建的事件来检测新文件,但请注意,此事件触发并不一定意味着文件已发布

本机C++规范和代码示例:

.net:


Windows提供了监视目录内容更新的API。 您可以使用创建的事件来检测新文件,但请注意,此事件触发并不一定意味着文件已发布

本机C++规范和代码示例:

.net: