c++ - 如何确定文件何时完成复制以供进一步处理?

标签 c++ windows file filesystems

好吧,所以开始这是严格针对 Windows 的,我更喜欢使用 C++ 而不是 .NET,但我不反对 boost::filesystem 尽管如果可以避免它有利于我更喜欢直接的 Windows API。

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

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

现在我可以扫描目录并尝试获取锁或打开文件以确定自上次通知以来具体发生了什么变化,以及它们是否可供进一步使用,但在复制大文件的情况下,我发现这是不可能的不够好,因为文件还没有准备好被操作,并且在第一个通知之后我不会收到任何其他通知,所以没有办法知道它何时实际完成复制,除非在第一个通知之后我不断尝试获取锁直到成功。

我唯一能想到的另一件事是拥有某种结束 token 文件,但由于我无法控制在第一个文件中创建文件的应用程序地方我不知道我会怎么做,它仍然不理想。

有什么建议吗?

最佳答案

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

其他策略包括当主文件完成时写入一个无字节文件作为触发器,写入一个临时目录,然后将完整文件移动到真正的目的地。但要可靠,必须由发件人控制。作为接收者,您只能观察目录并等待文件结算。

关于c++ - 如何确定文件何时完成复制以供进一步处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4974563/

相关文章:

c++ - 调试和发布库及其可执行程序

c++ - Qt 使用 QGraphicsDropShadow 为 QLabel 添加投影效果

c++ - TensorFlow protobuf 版本不匹配

c++ - 尝试用 C++ 编写简单的 makefile 时不断收到错误消息?

c++ - 在构造函数中将枚举作为参数传递

linux - Sublime Text - 如何在 Linux 或 Windows 上获取 OSX 键盘快捷键

windows - Win32 EXCEPTION_INT_OVERFLOW 与 EXCEPTION_INT_DIVIDE_BY_ZERO

Android:从相机获取文件名?

c - epoll_wait 的替代方案,它不等待文件描述符?

c - 如何在 C 编程中读取文件?