首页 > 解决方案 > 如何检查 std::filesystem::copy 是否结束?

问题描述

使用此代码将文件复制到一个目录到另一个目录

auto const copyOption = std::filesystem::copy_options::recursive | std::filesystem::copy_options::skip_symlinks;
std::filesystem::copy("/mnt/iso", "/mnt/usb", copyOption);

复制大文件可能需要很长时间。那么如何检查副本何时结束?

标签: c++ubuntustd-filesystem

解决方案


如何检查 std::filesystem::copy 是否结束?

对函数的调用以(1)返回、(2)抛出或(3)终止程序结束。

如果程序的执行继续到下一条语句(或下一个同级表达式),那么您知道函数调用已通过 (1) 返回而结束。如果执行继续展开并最终进入一个catch块,那么您知道该函数已通过 (2) 抛出结束。如果程序不再运行,那么您知道该函数 (3) 终止了程序(std::filesystem::copy不会直接执行此操作,尽管如果它在没有被捕获的情况下抛出它可能会发生)。如果这些都没有发生,那么你知道函数调用还没有结束。

例如,如果您有大文件,则在复制完成后尝试卸载 usbkey 将花费一两分钟的时间

C++ 中没有标准的方法来验证数据何时被物理写入设备。

您已标记 [ubuntu],因此您可能对fsyncPOSIX 标准中的函数感兴趣。您不能将它与std::filesystem::copy; 结合使用。您需要改用其他 POSIX 文件操作函数。fsync应保证内核已将任何写入传递给设备。从那时起,您将依赖硬件。


推荐阅读