我正在使用ReadDirectoryChangesW来监视一个文件夹,如果我正在将一个大文件复制到该文件夹,我可以收到多条FILE_ACTION_MODIFIED消息,似乎每次windows写入一大块文件,你都会修改文件每次通知。我尝试使用CreateFile API检查文件是否可以由AP打开,但有时某些文件总是被其他AP锁定,例如,如果您打开Outlook,PST将更新,但我的AP可以要访问它,我们必须启动Shadow Copy才能打开它。 所以我的问题是,如何知道文件已完成复制?
答案 0 :(得分:1)
这是一个非常hacky性质的解决方案,但在非常毛茸茸的情况下,您可以运行轮询循环来检查文件的大小(或修改日期)。如果它暂时没有改变,你可以稍微安全地假设文件已经完成复制。
编辑:这不是一般情况下的最佳解决方案,但考虑到OP的情况下,问题限制排除了更好的解决方案。在你想到downvoting之前想一想。
答案 1 :(得分:0)
当您轮询文件大小时,请勿使用_stat/_stat64
。而是每次需要时打开文件,并调用_filelengthi64
来获取文件的大小。 Windows {1}}返回的文件大小不会由Windows操作系统实时更新。此外,通过能够打开文件,您正在测试是否已完成任何长拷贝操作。
答案 2 :(得分:0)
Windows提供了一个用于监控目录内容更新的API。 您可以使用Created事件来检测新文件,但请注意,此事件触发并不一定意味着该文件尚未发布。
原生C ++规范和代码示例:
http://msdn.microsoft.com/en-us/library/aa365261(VS.85).aspx
.net:
http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx