std::filesystem::copy 默认不支持递归复制非空目录,必须显式指定 copy_options::recursive 才能拷贝整个文件夹,否则抛出 filesystem_error 异常。

std::filesystem::copy 为什么直接用会失败
因为 std::filesystem::copy 默认只复制单个文件或空目录,遇到非空目录会抛出 filesystem_error(错误码为 not_supported 或 is_a_directory),不是你代码写错了,是它根本没被设计成“一键拷贝整个文件夹”。
必须显式传入 copy_options 才能触发递归行为:
-
std::filesystem::copy_options::recursive:必需,否则不进子目录 -
std::filesystem::copy_options::skip_existing或overwrite_existing:避免目标已存在时崩溃 - 别漏掉
std::filesystem::copy_options::directories_only—— 它只建目录结构,不拷文件,容易误选
正确调用 std::filesystem::copy 的参数组合
最常用且安全的组合是递归 + 覆盖已有文件:
std::filesystem::copy("src_dir", "dst_dir",
std::filesystem::copy_options::recursive |
std::filesystem::copy_options::overwrite_existing);
注意两点:
- 第二个参数(目标路径)不能是已存在的**非空目录**且未加
overwrite_existing,否则抛异常 - 如果
dst_dir已存在且是空目录,recursive仍能工作;但若它里面已有同名文件,没加overwrite_existing就会失败 - Windows 下路径分隔符用
/或\都行,但建议统一用/,std::filesystem内部会自动适配
常见报错和对应修复
看到这些错误,基本就是参数或路径状态没对上:
-
std::filesystem::filesystem_error: No such file or directory→ 检查src_dir是否真实存在、拼写是否含不可见空格 -
Permission denied→ 目标目录父路径不可写,或源目录有只读文件但没开copy_options::skip_permission_denied -
File exists→ 目标路径已存在且你没传overwrite_existing或skip_existing - 静默跳过某些子目录 → 忘了加
recursive,它真的就只拷第一层
性能与跨平台注意事项
这个 API 是同步阻塞的,大目录会卡住线程;它不做缓冲优化,纯靠系统调用逐文件拷贝,速度不如 rsync 或 robocopy。
Windows 上对硬链接、符号链接的处理取决于 copy_options 组合;Linux/macOS 下默认不解析符号链接(即复制的是链接本身),要复制目标内容得额外处理 —— std::filesystem 不提供“解引用后递归”模式,得自己遍历判断 is_symlink() 再手动读取目标路径。
真正容易被忽略的一点:C++17 标准只要求实现支持 copy,但没强制要求所有平台都支持全部 copy_options 组合。GCC 9+、Clang 10+、MSVC 2019 16.6+ 没问题,但旧版本可能静默忽略 recursive —— 务必在目标环境中实测小样例。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











