如何确定何时复制文件以进行进一步处理?

AJG*_*G85 6 c++ windows filesystems file

好吧,所以开始这是严格的Windows,我更喜欢使用C++而不是.NET,但我不反对,boost::filesystem虽然如果可以避免支持直接的Windows API我更喜欢.

现在,该场景是另一台机器上的应用程序,我无法更改将在机器上的特定目录中创建文件,我需要备份并执行一些额外的处理.目前我已经制作了一个小应用程序,它将使用FindFirstChangeNotificationFindNextChangeNotificationWindows API 在目标目录中查找和监听更改通知.

问题是,虽然我可以在目录中创建新文件,修改,大小更改等时收到通知,但它只通知一次,并没有具体告诉我哪些文件.我也看了一下ReadDirectoryChangesW,但除了我可以获得更具体的信息外,它的故事也是如此.

现在我可以扫描目录并尝试获取锁定或打开文件以确定上次通知中的具体更改以及它们是否可供进一步使用但是在复制大文件的情况下我发现这不是很好足够的文件将无法被操作,我不会在第一次之后得到任何其他通知,所以没有办法告诉它何时实际完成复制,除非在第一次通知后我不断尝试获取锁,直到它成功.

我能想到的另一件事就是不那么强硬就是拥有某种终结令牌文件,但由于我无法控制创建文件的应用程序,所以我不知道我是怎么做的要做到这一点,它仍然不理想.

有什么建议?

T.R*_*Rob 4

这是一个相当常见的问题,而且没有简单的答案。当您无法更改远程端的内容时,获取锁是最好的选择之一。我见过的另一个方法是每隔一段时间观察文件,直到大小在一两个时间间隔内没有改变。

其他策略包括在主文件完成时写入无字节文件作为触发器,以及写入临时目录,然后将完整文件移动到实际目标。但为了可靠,必须由发送者控制它。作为接收者,您只能监视目录并等待文件稳定下来。