0

0

c++中如何实现文件复制_c++文件流复制操作【实战】

冰火之心

冰火之心

发布时间:2026-03-13 19:16:03

|

500人浏览过

|

来源于php中文网

原创

小文件复制用 std::ifstream/ofstream 流式读写最稳,需开二进制模式、设 8KB 缓冲区、用 gcount() 判断末次读取;大文件(>100MB)应优先用 std::filesystem::copy(C++17),并务必检查返回值和捕获 filesystem_error 异常。

c++中如何实现文件复制_c++文件流复制操作【实战】

std::ifstreamstd::ofstream 复制小文件最稳

直接读完再写完,适合几 MB 以内的文件,逻辑清晰、出错好定位。关键不是“能不能”,而是「缓冲区怎么设」和「二进制模式要不要开」。

常见错误现象:std::ios::binary 没加,复制图片或可执行文件后损坏;用 operator 而不是 <code>read()/write(),遇到 \0 就截断。

  • 源文件必须用 std::ios::binary 打开,目标文件同理
  • 别用 in >> buffer,改用 in.read(buf, size) + out.write(buf, n)
  • 缓冲区大小建议设为 8192(8KB),太小频繁系统调用,太大无意义
  • 每次 read() 后检查 gcount(),不是 eof() —— eof() 只在读失败后才置位
std::ifstream in("src.bin", std::ios::binary);
std::ofstream out("dst.bin", std::ios::binary);
char buf[8192];
while (in.read(buf, sizeof(buf))) {
    out.write(buf, sizeof(buf));
}
if (in.gcount() > 0) {
    out.write(buf, in.gcount());
}

大文件复制要用 std::filesystem::copy(C++17)

超过 100MB 的文件,自己流式读写容易卡顿、占 CPU、且不利用系统优化。C++17 的 std::filesystem::copy 底层会走 copy_file_range(Linux)或 CopyFile(Windows),零拷贝或内核加速。

使用场景:构建工具、安装程序、备份逻辑中需要可靠、高效、跨平台的复制。

立即学习C++免费学习笔记(深入)”;

AITDK
AITDK

免费AI SEO工具,SEO的AI生成器

下载
  • 必须包含 <filesystem>,链接时可能需加 -lstdc++fs(GCC 旧版本)
  • 默认行为是覆盖目标文件,要跳过已存在文件得传 std::filesystem::copy_options::skip_existing
  • 不抛异常,但返回值是 bool,失败时静默 —— 务必检查返回值
  • Windows 上路径含中文没问题,Linux 上注意 locale 是否支持 UTF-8 路径
namespace fs = std::filesystem;
bool ok = fs::copy("a.log", "b.log", fs::copy_options::overwrite_existing);
if (!ok) {
    // 实际失败了,但没报错 —— 这里得自己处理
}

std::filesystem::copystd::filesystem::filesystem_error 怎么办

它不总返回 false,某些条件(如权限不足、目标只读、路径过长)会直接抛异常。很多人只查返回值,漏捕获这个异常,导致程序崩溃。

典型错误信息:filesystem error: cannot copy: Permission deniedNo such file or directory

  • 必须用 try/catch 包住调用,不能只信返回值
  • 异常对象有 .path1().path2() 方法,能准确定位哪个路径出问题
  • 不要 catch std::exception& 就完事 —— filesystem_error 是独立类型,最好显式捕获
  • 如果不想中断流程,可用带 std::error_code& 的重载,它不抛异常,把错误码写进参数里
std::error_code ec;
fs::copy("src", "dst", fs::copy_options::overwrite_existing, ec);
if (ec) {
    // ec.message() 是 "Permission denied" 这类字符串
    // ec.value() 是 errno 值,比如 EACCES == 13
}

Windows 下用 CreateFile + CopyFile 更底层但更可控

当你要精确控制安全描述符、继承性、或绕过 std::filesystem 的 ABI 兼容问题(比如混用不同 MSVC 版本编译的库),就得调 Win32 API。

性能上和 std::filesystem::copy 差不多,但多出两件事:权限继承控制、异步支持。

  • CopyFile 默认不保留时间戳,要保留得用 CopyFileEx 并传 COPY_FILE_COPY_SYMLINK 标志(其实名字误导,它也管时间戳)
  • CreateFile 打开源文件时,dwShareMode 设为 FILE_SHARE_READ,否则其他进程读不了原文件
  • 目标路径父目录不存在时,CopyFile 不自动创建 —— 得先调 CreateDirectorySHCreateDirectory
  • 返回值是 BOOL,失败时用 GetLastError() 查具体原因,比如 ERROR_ACCESS_DENIED
BOOL ok = CopyFile(L"src.txt", L"dst.txt", FALSE); // FALSE = 不交互覆盖
if (!ok) {
    DWORD err = GetLastError(); // 别忽略这个
}
实际项目里,80% 的情况用 std::filesystem::copyerror_code 版就足够;真碰上权限、符号链接、或嵌入式受限环境,才需要切到流式读写或 Win32。最常被忽略的是:没人检查 gcount(),也没人捕获 filesystem_error,结果线上复制一半静默失败。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

492

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

382

2023.10.25

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

492

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

382

2023.10.25

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

492

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

382

2023.10.25

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1496

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1170

2023.07.27

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.3万人学习

C 教程
C 教程

共75课时 | 5.4万人学习

C++教程
C++教程

共115课时 | 21.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号