C ++目录监视 – 如何检测复制已结束

我有一个文件夹复制到文件。 我想看它,并将文件复制到目录后立即处理。 我可以检测文件在目录中的位置,无论是通过轮询(我当前的实现),还是在一些使用Windows API的testing中,我都可以在线find一些样本。

问题是,我检测到文件第一次创build时,它仍然被复制。 这使得我的程序需要通过错误来访问文件(因为文件还没有完成)。 复印何时开始,复印何时结束? 我在Windows上使用C ++,所以答案可能依赖于平台,但如果可能的话,我宁愿它是平台不可知的。

Solutions Collecting From Web of "C ++目录监视 – 如何检测复制已结束"

您可以使用锁定文件或特殊的命名约定。 最简单的是后者,可以这样工作:

假设你想要移动一个名为“fileA.txt”的文件,当把它复制到目的地目录时,应该把它复制到“fileA.txt.partial”之类的东西。 复制完成后,将文件从“fileA.txt.partial”重命名为“fileA.txt”。 所以“fileA.txt”的外观只要观看程序可以看到就是原子的。

前面提到的另一个选项是锁定文件。 因此,当您复制名为“fileA.txt”的文件时,首先创建一个名为“fileA.txt.lock”的文件。 复制完成后,只需删除锁定文件即可。 当观看程序看到“fileA.txt”时,应该检查“fileA.txt.lock”是否存在,如果存在,可以根据需要等待或重新访问该文件。

你不应该投票。 使用FindFirstChangeNotification(http://msdn.microsoft.com/en-us/library/windows/desktop/aa364417%28v=vs.85%29.aspx)来查看目录的更改。

然后使用等待函数(http://msdn.microsoft.com/en-us/library/windows/desktop/ms687069%28v=vs.85%29.aspx)等待更改通知发生。

概述和示例: http : //msdn.microsoft.com/en-us/library/windows/desktop/aa365261%28v=vs.85%29.aspx

我不确定如何确定文件写入完成。 埃文·特兰的答案是一个好主意。