std::filesystem::copy_options 核心枚举值说明
std::filesystem::copy_options 是C++17标准库中定义的枚举类型,用于配置 std::filesystem::copy 函数的复制行为,常用枚举值可以分为以下几类:
- 覆盖控制类:none(默认,目标存在则报错)、overwrite_existing(覆盖已存在目标)、skip_existing(跳过已存在目标)、update_existing(仅当源文件更新时覆盖)
- 递归控制类:recursive(递归复制目录下的所有内容)
- 符号链接处理类:copy_symlinks(复制符号链接本身)、skip_symlinks(跳过符号链接)、copy_symlink(复制符号链接指向的内容)
- 其他常用类:directories_only(仅复制目录结构,不复制文件)、create_symlinks(创建指向源的符号链接而非复制内容)
基础文件备份实战
首先实现最基础的文件备份功能,支持选择覆盖或跳过已存在的目标文件:
#include <filesystem>
#include <iostream>
#include <string>
namespace fs = std::filesystem;
// 基础文件备份函数,可选择覆盖或跳过已存在文件
bool basic_file_backup(const fs::path& source, const fs::path& dest, bool overwrite) {
try {
// 根据是否覆盖选择对应的copy_options
fs::copy_options options = overwrite ? fs::copy_options::overwrite_existing : fs::copy_options::skip_existing;
fs::copy(source, dest, options);
std::cout << "备份成功:" << source << " 到 " << dest << std::endl;
return true;
} catch (const fs::filesystem_error& e) {
std::cerr << "备份失败:" << e.what() << std::endl;
return false;
}
}
int main() {
// 测试备份单个文件,选择覆盖已存在文件
basic_file_backup("test.txt", "backup/test.txt", true);
// 测试备份单个文件,选择跳过已存在文件
basic_file_backup("test.txt", "backup/test.txt", false);
return 0;
}
递归目录备份实战
实际备份场景中经常需要备份整个目录下的所有文件和子目录,此时需要结合 recursive 枚举值实现:
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
// 递归备份整个目录,跳过已存在的文件
bool recursive_dir_backup(const fs::path& source_dir, const fs::path& dest_dir) {
try {
// 检查源是否为目录
if (!fs::is_directory(source_dir)) {
std::cerr << "源路径不是目录:" << source_dir << std::endl;
return false;
}
// 组合递归和跳过已存在的选项
fs::copy_options options = fs::copy_options::recursive | fs::copy_options::skip_existing;
fs::copy(source_dir, dest_dir, options);
std::cout << "目录递归备份完成:" << source_dir << " 到 " << dest_dir << std::endl;
return true;
} catch (const fs::filesystem_error& e) {
std::cerr << "目录备份失败:" << e.what() << std::endl;
return false;
}
}
int main() {
recursive_dir_backup("project_src", "project_backup");
return 0;
}
符号链接与增量备份实战
备份时还需要处理符号链接,同时实现增量备份(仅备份修改时间更新的文件),可以组合多个 copy_options 枚举值:
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
// 增量备份目录,处理符号链接,仅更新修改时间更新的文件
bool incremental_backup(const fs::path& source_dir, const fs::path& dest_dir) {
try {
// 组合递归、更新已存在文件、跳过符号链接的选项
fs::copy_options options = fs::copy_options::recursive
| fs::copy_options::update_existing
| fs::copy_options::skip_symlinks;
fs::copy(source_dir, dest_dir, options);
std::cout << "增量备份完成:" << source_dir << " 到 " << dest_dir << std::endl;
return true;
} catch (const fs::filesystem_error& e) {
std::cerr << "增量备份失败:" << e.what() << std::endl;
return false;
}
}
int main() {
incremental_backup("data_dir", "data_backup");
return 0;
}
注意事项
使用 std::filesystem::copy_options 时需要注意以下几点:
- 编译时需要开启C++17及以上标准,GCC需要添加 -std=c++17 编译选项,MSVC需要设置C++语言标准为C++17
- 多个 copy_options 枚举值可以通过按位或运算符 | 组合使用,满足复杂备份需求
- 如果目标路径的父目录不存在,copy 函数不会自动创建父目录,需要提前通过 fs::create_directories 创建
- 不同操作系统对符号链接的支持不同,跨平台使用时需要测试对应枚举值的表现
std::filesystemcopy_options文件备份c++修改时间:2026-07-02 03:12:33