【问题标题】:C++ - Update/mirror a folder backup with BOOST Filesystem (1.55)C++ - 使用 BOOST 文件系统 (1.55) 更新/镜像文件夹备份
【发布时间】:2017-07-04 16:23:30
【问题描述】:

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

我找到了 nijansen 的 copyDir 方法,但它有一个问题:尝试复制到由于此代码而已存在的目录时它“中断”:

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

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

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

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

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

【问题讨论】:

    标签: c++ boost-filesystem


    【解决方案1】:

    为了回答我自己的问题,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 中排除文件/目录的方法(将 if 语句添加到在 copyDir 方法中进行复制的“else”中。

    // 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);
    }
    

    无论如何,谢谢!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-03
      • 2020-10-15
      • 2016-05-28
      • 1970-01-01
      相关资源
      最近更新 更多