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);
}
总之,谢谢!
我正在尝试备份用户配置文件(或更准确地复制特定目录,例如 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);
}
总之,谢谢!