std::filesystem::copy最省事但需c++17,默认不覆盖文件且不递归目录;windows可用copyfilew默认覆盖;手写流拷贝兼容性好但须以二进制模式操作。

用 std::filesystem::copy 最省事,但得 C++17 且注意默认行为
如果你的编译器支持 C++17(GCC 8+、Clang 7+、MSVC 2017 Update 5+),std::filesystem::copy 是首选。它封装了平台差异,一行就能完成拷贝:
std::filesystem::copy("src.txt", "dst.txt");
但默认不覆盖已有文件——如果 dst.txt 已存在,会抛出 std::filesystem::filesystem_error,错误信息类似 "File exists"。要覆盖,必须显式传参:
-
std::filesystem::copy_options::overwrite_existing:覆盖目标文件 -
std::filesystem::copy_options::skip_existing:跳过已存在的目标 - 不加选项时行为等价于
copy_options::none,即拒绝覆盖
另外,copy 默认不递归复制目录;若源是目录且想复制整个目录树,需加 copy_options::recursive。
Windows 下用 CopyFileA/CopyFileW 更底层、更可控
在 Windows 平台,直接调用 Win32 API 的 CopyFileW(推荐宽字符版)更轻量,也不依赖 C++17。它默认覆盖目标文件,失败时返回 false,可通过 GetLastError() 查错:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
if (!CopyFileW(L"src.bin", L"dst.bin", FALSE)) {
DWORD err = GetLastError();
// err == ERROR_FILE_EXISTS 表示目标存在且第三个参数为 TRUE 时才报错
// 这里第三个参数是 FALSE → 覆盖,所以通常 err 是其他值,如 ERROR_ACCESS_DENIED
}
- 第三个参数为
FALSE:强制覆盖(类似 Unix 的cp -f) - 设为
TRUE:不覆盖,目标存在则失败 - 路径必须是绝对路径或当前工作目录下可解析的相对路径;相对路径不自动补全
.或.. - 不处理符号链接——直接复制链接本身,而非目标内容
跨平台手写流拷贝:简单可靠,但要注意缓冲区和异常安全
用 std::ifstream + std::ofstream 手动读写,兼容所有 C++ 标准,也最容易调试。但别直接 in >> out.rdbuf()——这在二进制文件中可能截断 \0 或换行符:
std::ifstream src("src.dat", std::ios::binary);
std::ofstream dst("dst.dat", std::ios::binary);
dst
<p>正确做法是分块读取,控制缓冲区大小(避免内存暴涨或太小影响性能):</p>
- 典型缓冲区选 8KB(
8192字节):平衡内存与 I/O 次数 - 务必检查每次
read()的实际字节数,gcount()返回真实读取量 - 打开文件时显式加
std::ios::binary,否则 Windows 下文本模式会转换\r\n - 用 RAII 管理流对象,异常发生时自动析构,但需手动检查
failbit或badbit
遇到“权限不足”或“路径不存在”时,std::filesystem 的错误提示容易误导
std::filesystem::copy 抛出的异常类型统一为 std::filesystem::filesystem_error,但错误码(.code().value())才是关键线索:
-
std::errc::permission_denied(值 13):目标目录不可写,或源文件被占用/只读 -
std::errc::no_such_file_or_directory(值 2):源路径不存在,或目标父目录不存在(copy不自动创建中间目录) -
std::errc::is_a_directory(值 21):试图把文件拷到同名目录上,或反向操作
常见疏忽是忘了提前创建目标父目录:std::filesystem::create_directories 必须单独调用,不能指望 copy 代劳。另外,某些杀毒软件会锁住临时文件,导致 permission_denied,此时换路径或关软件再试更有效。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










