C++目录监视 - 如何检测副本已结束

pet*_*nts 7 c++ windows directory visual-c++

我有一个复制文件的文件夹.我想在将文件复制到目录后立即查看并处理文件.我可以检测文件何时在目录中,是通过轮询(我当前的实现)还是在某些测试中使用Windows API从我在网上找到的一些样本中检测到的.

问题是我检测到文件首次创建时仍然被复制.这使我的程序需要通过错误访问该文件(因为该文件尚未完成).如何在复制开始时复制到复制结束时如何检测?我在Windows上使用C++,所以答案可能取决于平台,但如果可能的话,我更喜欢它与平台无关.

Eva*_*ran 4

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

假设您想要移动名为“fileA.txt”的文件,则将其复制到目标目录时,请将其复制到“fileA.txt.partial”或类似的目录。复制完成后,将文件从“fileA.txt.partial”重命名为“fileA.txt”。因此,就观看程序而言,“fileA.txt”的出现是原子的。

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

  • 嗯,这是一种解决方法,可能适用于其他环境。但在这种情况下,我谈论的是其他程序/通过文件资源管理器将文件复制到我的程序正在监视的文件夹。在这种情况下,这种方法就很难实现。 (2认同)