不会,默认只复制单个文件或空目录;必须显式指定std::filesystem::copy_options::recursive才能递归复制目录,否则会报错或仅创建空目录。

std::filesystem::copy 会递归复制目录吗?
不会,默认只复制单个文件或空目录。std::filesystem::copy 的行为完全取决于你传的第三个参数(std::filesystem::copy_options),不显式指定,它连子目录里的文件都不会碰。
必须用 copy_options::recursive 才能递归
这是最关键的开关。漏掉它,哪怕源是完整目录树,目标也只会得到一个空目录(如果目标不存在)或报 filesystem error: copy: Is a directory 错误。
常见错误现象:
- 调用
std::filesystem::copy(src, dst)后,dst下没有任何子文件,只有空文件夹 - 程序崩溃并抛出
std::filesystem::filesystem_error,错误消息里含Is a directory
正确写法示例:
立即学习“C++免费学习笔记(深入)”;
std::filesystem::copy(
"/path/to/src",
"/path/to/dst",
std::filesystem::copy_options::recursive
);
注意:copy_options::recursive 必须显式传入;它不包含 skip_existing 或 overwrite_existing,这些要额外叠加。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
覆盖、跳过、权限保留怎么组合?
std::filesystem::copy_options 是位掩码类型,支持按位或组合。但要注意顺序和语义冲突:
-
std::filesystem::copy_options::overwrite_existing:目标存在时强制覆盖(含文件和目录) -
std::filesystem::copy_options::skip_existing:目标存在则跳过整个条目(推荐用于避免误删) -
std::filesystem::copy_options::copy_symlinks:复制符号链接本身,而非其指向内容(默认会解引用) -
std::filesystem::copy_options::create_symlinks:把普通文件“变成”符号链接(慎用)
典型安全组合:
std::filesystem::copy_options::recursive | std::filesystem::copy_options::skip_existing
性能影响:加 skip_existing 会多一次 exists() 检查,但避免了不必要的读写和潜在覆盖风险;overwrite_existing 在大文件场景下可能触发重写,比跳过慢得多。
Windows 上路径分隔符和权限问题
Windows 不区分正斜杠/反斜杠,但 std::filesystem 内部统一处理,你用 "C:/src" 或 R"(C:\src)" 都行。真正容易踩坑的是权限:
- 目标目录若被其他进程占用(如资源管理器正打开该文件夹),
copy可能抛permission denied - 源目录含只读文件时,Linux/macOS 默认可复制,Windows 可能失败(除非加上
std::filesystem::copy_options::permissions) - 某些 Windows 安全策略会拦截对
C:\Program Files等路径的写入,此时不是代码问题,而是需要提权运行
建议始终捕获异常并检查具体错误码:
try {
std::filesystem::copy(src, dst, opts);
} catch (const std::filesystem::filesystem_error& e) {
// e.code().message() 包含真实系统错误,比如 "Access is denied"
}
递归复制看着简单,实际成败常卡在选项组合和平台细节上——尤其是 recursive 忘加、skip_existing 和 overwrite_existing 混用、以及 Windows 下静默的权限拦截。


















