C++ - Update/mirror 使用 BOOST 文件系统 (1.55) 的文件夹备份

C++ - Update/mirror a folder backup with BOOST Filesystem (1.55)

我正在尝试备份用户配置文件(或更准确地复制特定目录,例如 username\documents、username\desktop、等)到网络共享驱动器。我正在使用 C++ 构建器(10.1 启动器),因此仅限于提升 1.55。

我发现了 nijansen 的这个 copyDir 方法,但它有一个问题:它 "breaks" 当试图复制到一个已经存在的目录时,因为这个代码:

if(fs::exists(destination))
{
    std::cerr << "Destination directory " << destination.string()
        << " already exists." << '\n';
    return false;
}

显然我可以将其更改为删除目录(如果存在),而不是返回而不是让它继续复制,但我正在寻找更多。

我想做的是将目录从原始目录镜像到备份目录(如 robocopy 的 /MIR 标志(包括子目录))。如果我今天备份一个用户,然后他们删除了一些东西,创建了一些东西,编辑了一个文档等等,我只想将这些更改复制到明天的备份中(而不是重新备份所有没有改变的东西)。有些用户有 50+ GB 的数据,如果我只是删除他们的 "yesterday's" 备份文件夹并创建一个全新的备份,这将花费太长时间。

总结:有没有办法使用 BOOST 在源和目标之间镜像(不仅仅是复制!)目录树?

任何帮助 and/or 示例将不胜感激!提前致谢!

为了回答我自己的问题,copy_file 方法有一个可以传递给它的第三个参数 - fs::copy_option::overwrite_if_exists。如果您使用 nijansen's copyDir method 并将此选项添加到 copy_file 调用,它将覆盖文件(如果它已经存在)(更新实时备份中的文件)。

函数调用变为:

fs::copy_file(current,
    destination / current.filename(), 
    fs::copy_option::overwrite_if_exists);

此外,对于偶然发现这个问题的任何人,我还想出了一种从 copy_file 中排除 files/directories 的方法(将 if 语句添加到执行在 copyDir 方法中复制。

// Need to exclude My Music, My Pictures, My Videos (from Documents folder)
std::string stem = current.filename().string();
//If not equal to excludes, then copy away; else skips them
if (!(stem == "My Music" || stem == "My Pictures" || stem == "My Videos"))
{
    fs::copy_file(current,destination / current.filename(), 
        fs::copy_option::overwrite_if_exists);
}

总之,谢谢!