C/C++中使用CopyFile、CopyFileEx原理、用法、区别及分别在哪些场景使用
文章目录
- 1. CopyFile
- 原理
- 函数原型
- 返回值
- 用法示例
- 适用场景
- 2. CopyFileEx
- 原理
- 函数原型
- 返回值
- 用法示例
- 适用场景
- 3. 核心区别
- 4. 选择建议
- 5. 常见问题
- 6.区别
在Windows系统编程中,CopyFile和CopyFileEx是用于文件复制的两个API函数。它们的核心区别在于功能扩展性和控制粒度,以下是详细分析:
1. CopyFile
原理
- 同步阻塞:函数调用后线程会阻塞,直到复制完成或失败。
- 简单复制:仅复制文件内容,不支持进度回调或中断操作。
- 原子性操作:直接覆盖或保留目标文件,无中间状态。
函数原型
BOOL CopyFile(LPCSTR lpExistingFileName, // 源文件路径LPCSTR lpNewFileName, // 目标文件路径BOOL bFailIfExists // 目标存在时是否失败(TRUE=禁止覆盖)
);
- lpExistingFileName: 指向一个以null结尾的字符串,指定要复制的现有文件的路径。
- lpNewFileName: 指向一个以null结尾的字符串,指定新文件的路径。
- bFailIfExists: 如果该参数为
TRUE,并且目标文件已存在,则函数将失败。如果为FALSE,目标文件将被覆盖。
返回值
- 如果函数成功,返回值为非零值。
- 如果函数失败,返回值为零。可以使用
GetLastError获取更多错误信息。
用法示例
#include <Windows.h>int main() {BOOL result = CopyFile("C:\\source.txt", "D:\\dest.txt", FALSE // 允许覆盖);if (!result) {DWORD error = GetLastError();// 处理错误...}return 0;
}
适用场景
- 需要快速复制小文件。
- 无需用户交互或进度反馈。
- 简单工具或脚本中快速实现文件复制。
2. CopyFileEx
原理
- 异步支持:通过回调函数支持进度跟踪和操作中断。
- 扩展功能:支持重启复制(
COPY_FILE_RESTARTABLE)、文件属性保留等。 - 分块复制:可能通过多次调用回调函数分批次复制数据。
函数原型
BOOL CopyFileEx(LPCSTR lpExistingFileName,LPCSTR lpNewFileName,LPPROGRESS_ROUTINE lpProgressRoutine, // 进度回调函数LPVOID lpData, // 传递给回调的用户数据LPBOOL pbCancel, // 取消标志指针DWORD dwCopyFlags // 复制标志(如重启模式)
);
- lpExistingFileName: 指向一个以null结尾的字符串,指定要复制的现有文件的路径。
- lpNewFileName: 指向一个以null结尾的字符串,指定新文件的路径。
- lpProgressRoutine: 指向一个进度例程的指针,该例程在复制过程中被调用,可以用于显示复制进度或允许用户取消操作。如果不需要进度例程,可以设置为
NULL。 - lpData: 指向一个包含进度例程所需数据的指针,可以是
NULL。 - pbCancel: 指向一个布尔值的指针,如果设置为
TRUE,复制操作将被取消。可以是NULL。 - dwCopyFlags: 指定复制操作的选项,可以是以下值的组合:
COPY_FILE_FAIL_IF_EXISTS: 如果目标文件已存在,复制操作将失败。COPY_FILE_RESTARTABLE: 创建可以恢复的复制操作。COPY_FILE_OPEN_SOURCE_FOR_WRITE: 允许源文件在复制过程中被写入。COPY_FILE_ALLOW_DECRYPTED_DESTINATION: 允许将未加密文件复制到未加密目标。COPY_FILE_NO_BUFFERING: 复制操作是使用未缓冲的 I/O 执行,绕过系统 I/O 缓存资源。COPY_FILE_COPY_SYMLINK: 如果源文件是符号链接,则目标文件也是指向源符号链接指向的同一文件的符号链接。COPY_FILE_REQUEST_COMPRESSED_TRAFFIC: 请求基础传输通道在复制操作期间压缩数据。 对于所有媒体,请求可能不受支持,在这种情况下,它将被忽略。 压缩属性和参数(计算复杂性、内存使用情况)无法通过此 API 进行配置,并且可能会在不同的 OS 版本之间更改。。
返回值
- 如果函数成功,返回值为非零值。
- 如果函数失败,返回值为零。可以使用
GetLastError获取更多错误信息。
用法示例
#include <Windows.h>DWORD CALLBACK ProgressCallback(LARGE_INTEGER TotalFileSize,LARGE_INTEGER TotalBytesTransferred,LARGE_INTEGER StreamSize,LARGE_INTEGER StreamBytesTransferred,DWORD dwStreamNumber,DWORD dwCallbackReason,HANDLE hSourceFile,HANDLE hDestinationFile,LPVOID lpData
) {// 显示进度百分比double progress = (double)TotalBytesTransferred.QuadPart / TotalFileSize.QuadPart * 100;printf("进度: %.2f%%\n", progress);return PROGRESS_CONTINUE; // 继续复制
}int main() {BOOL result = CopyFileEx("C:\\bigfile.iso","D:\\bigfile.iso",ProgressCallback,nullptr, // 无额外数据传递nullptr, // 不使用取消标志COPY_FILE_RESTARTABLE);if (!result) {DWORD error = GetLastError();// 处理错误...}return 0;
}
适用场景
- 大文件复制需要显示实时进度条。
- 允许用户取消长时间操作(如资源管理器中的文件复制)。
- 需要断点续传功能的备份软件。
3. 核心区别
| 特性 | CopyFile | CopyFileEx |
|---|---|---|
| 进度反馈 | 不支持 | 支持通过回调函数 |
| 操作中断 | 无法取消 | 可通过回调返回值或取消标志终止 |
| 复制模式 | 仅基础复制 | 支持重启模式(COPY_FILE_RESTARTABLE) |
| 适用文件大小 | 小文件(<100MB) | 大文件(如GB级) |
| 复杂度 | 简单,参数少 | 复杂,需处理回调和标志位 |
4. 选择建议
- 优先
CopyFile:当需求简单、无需额外控制时,代码更简洁高效。 - 必须用
CopyFileEx:若需要以下高级功能:- 用户界面中的进度条更新。
- 允许用户取消耗时操作。
- 断点续传或错误恢复机制。
- 复制文件时保留更多元数据(如ACL)。
5. 常见问题
- 跨卷复制:两者均支持,但
CopyFileEx可通过标志优化。 - 错误处理:均需检查返回值并通过
GetLastError()获取错误码。 - Unicode支持:实际开发中应使用
CopyFileW/CopyFileExW处理宽字符路径。
6.区别
-
参数类型:
CopyFile使用的是LPCSTR类型的字符串,即ANSI字符串。CopyFileEx使用的是LPCTSTR类型的字符串,可以是ANSI或Unicode字符串。
-
功能:
CopyFile是一个简单的文件复制函数,适合快速复制文件。CopyFileEx提供了更多的功能,如进度回调、取消复制等,适合需要更复杂控制的场景。
-
灵活性:
CopyFileEx比CopyFile更灵活,可以处理更大的文件,并且可以提供复制进度的反馈。
-
适用场景:
- CopyFile:适用于简单的文件复制操作,不需要进度反馈或复杂控制。
- CopyFileEx:适用于需要实时监控复制进度、允许用户取消操作或处理大文件的场景。
通过合理选择这两个API,可以在功能复杂性和代码效率之间取得平衡。
此后为废话,纯粹是为了应对csdn质量分,没有任何价值,不要浏览。

更多学习资料
无论代码世界如何复杂,请记住:每一个“复制”的瞬间,都是向目标更进一步的印记。即使遇到“错误”与“中断”,只要心怀“重启”的勇气,终将在调试中突破,在坚持中抵达。愿你在技术的长路上,像
CopyFileEx一样永不止步,以智慧为引,以耐心为伴,书写属于你的完美程序!
🚀 代码无涯,行者无疆——你的下一行,或许就是改变世界的起点。
相关文章:
C/C++中使用CopyFile、CopyFileEx原理、用法、区别及分别在哪些场景使用
文章目录 1. CopyFile原理函数原型返回值用法示例适用场景 2. CopyFileEx原理函数原型返回值用法示例适用场景 3. 核心区别4. 选择建议5. 常见问题6.区别 在Windows系统编程中,CopyFile和CopyFileEx是用于文件复制的两个API函数。它们的核心区别在于功能扩展性和控制…...
qt 多进程使用共享内存 ,加速数据读写,进程间通信 共享内存
Summary: 项目中我们有时需要使用共享内存共享数据,这样,数据不用进程IO读写,加进数据加载和落地; 程序退出时,再保存到本地;速度提升数十倍; Part1:QSharedMemory Windows平台下进程间通信…...
HTML左右分页2【搬代码】
HTML左右分页2 html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>左右分页布局</title>&l…...
【鸿蒙开发】OpenHarmony调测工具hdc使用教程(设备开发者)
00. 目录 文章目录 00. 目录01. OpenHarmony概述02. hdc简介03. hdc获取04. option相关的命令05. 查询设备列表的命令06. 服务进程相关命令07. 网络相关的命令08. 文件相关的命令09. 应用相关的命令10. 调试相关的命令11. 常见问题12. 附录 01. OpenHarmony概述 OpenHarmony是…...
【贪心算法】简介
1.贪心算法 贪心策略:解决问题的策略,局部最优----》全局最优 (1)把解决问题的过程分成若干步 (2)解决每一步的时候,都选择当前看起来的“最优”的算法 (3)“希望”得…...
transformer模型介绍——大语言模型 LLMBook 学习(二)
1. transformer模型 1.1 注意力机制 **注意力机制(Attention Mechanism)**在人工智能中的应用,实际上是对人类认知系统中的注意力机制的一种模拟。它主要模仿了人类在处理信息时的选择性注意(Selective Attention)&a…...
【GPT入门】第11课 FunctionCall调用本地代码入门
【GPT入门】第11课 FunctionCall调用代码入门 1. 手撕FunctionCall2.代码3.functionCall的结果 1. 手撕FunctionCall 为了了解,funcationCall底层,手写一个functionCall多方法,并调用,体验 思路: 任务:让…...
LangChain教程 - Agent -之 ZERO_SHOT_REACT_DESCRIPTION
在构建智能 AI 助手时,我们希望模型能够智能地调用工具,以便提供准确的信息。LangChain 提供了 AgentType.ZERO_SHOT_REACT_DESCRIPTION,它结合了 ReAct(Reasoning Acting)策略,使得 LLM 可以基于工具的描…...
GStreamer —— 2.17、Windows下Qt加载GStreamer库后运行 - “播放教程 5:色彩平衡“(附:完整源码)
运行效果 介绍 亮度、对比度、色相和饱和度是常见的视频调整, 在 GStreamer 中统称为 Color Balance 设置。 本教程展示了: • 如何找出可用的色彩平衡通道 • 如何更改它们 允许访问颜色平衡设置。如果 元素支持这个接口,只需将其转发给应用…...
串口通信ASCII码转16进制及C#串口编程完整源码下载
在工业自动化、嵌入式系统及物联网以行业中,串口编程非常重要。 串口编程,重点在于串口数据通信和数据处理。 在C#中,System.IO.Ports命名空间提供了SerialPort类,用于实现串口通信。 串口程序的开发主要包括以下几点 1.引用命…...
解决vscode中出现“无法将pip项识别...“问题
问题 遇见问题如下: 查看pip 通过 winR ,输入 cmd,进入终端,搜索 where pip。 发现 pip 查不出来,然后进入文件资源管理器,搜索 Scripts 文件夹,如果没有找到可能是电脑没有下载 python。 点击…...
nacos下载及安装
下载官方最新稳定版 github下载较慢,推荐下面的下载链接 Nacos Server 下载 | Nacos 官网 点击下载和试用下载最新稳定版 Nacos Server 下载 | Nacos 官网 配置检查(可选) 默认情况下,Nacos 使用内置的 Derby 数据库&#x…...
C++从零实现Json-Rpc框架
文章目录 一、项目介绍1. 基本原理2. 涉及到的技术栈3. 最终实现的效果 二、 第三方库的介绍与使用1. JsonCpp库Json的数据格式JsonCpp介绍封装Json工具类 2. muduo库muduo库是什么Muduo库常见接口介绍 3. C11异步操作std::future 三、框架设计1. 服务端模块划分NetworkProtoco…...
rom定制系列------小米note3 原生安卓15 批量线刷 默认开启usb功能选项 插电自启等
小米Note 3搭载骁龙660处理器,1200万像素广角镜头、俗称大号版的小米6,官方最终版为12.0.1稳定版安卓9的固件。客户需要运行在安卓15的rom。根据原生官网的rom修改一些功能选项。以便客户操作需求。 定制资源说明 根据客户需求采用安卓15原生系统为底包…...
使用jest测试用例之入门篇
Jest使用 Jest 是由 Facebook 开发的一个 js 测试框架,jest 主要侧重于被用于做单元测试和集成测试 安装 npm i jest -D运行 **package.json**里面配置命令 // scripts添加测试脚本 {"test": "jest" /* 运行后便会使用 jest 执行所有的 .t…...
大数据学习(59)-DataX执行机制
&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博主哦ᾑ…...
YashanDB认证,YCA证书认证教程,免费证书,内含真题考试题库及答案——五分钟速成
目录 一.账号及平台注册登录流程 二.登录进行设备调试核验 三.考试(考完获取分数) 四.获取证书 五.题库及答案 一.账号及平台注册登录流程 1-点击这里进行账号注册(首次学习必须先注册,有账号之后可以直接在2号链接登录&#…...
消防行业如何借助 TDengine 打造高效的数据监控与分析系统
小T导读:本篇文章来自“2024,我想和 TDengine 谈谈”征文活动的优秀投稿,深入探讨了如何在消防行业中运用 TDengine 进行业务建模。文章重点介绍了如何通过 TDengine 的超级表、标签设计和高效查询功能,有效管理消防监控系统中的时…...
自然语言处理中的语音识别技术:从声波到语义的智能解码
引言 语音识别(Automatic Speech Recognition, ASR)是自然语言处理(NLP)的关键分支,旨在将人类语音信号转化为可处理的文本信息。随着深度学习技术的突破,语音识别已从实验室走向日常生活,赋能…...
010-Catch2
Catch2 一、框架简介 Catch2 是一个基于 C 的现代化单元测试框架,支持 TDD(测试驱动开发)和 BDD(行为驱动开发)模式。其核心优势在于: 单头文件设计:v2.x 版本仅需包含 catch.hpp 即可使用自然…...
TypeScript类:面向对象编程的基石
一、从现实世界到代码世界 想象你要建造一栋房子,首先需要一张设计蓝图——它定义了房屋的结构(几个房间)、功能(卧室/厨房)和特性(材料/颜色)。在TypeScript中,class就是这个设计蓝…...
Bad owner or permissions on ssh/config - 解决方案
问题 在Windows系统通过ssh连接远程服务器时报错: ssh [ssh_user][ip] Bad owner or permissions on C:\\Users\\[win_user]/.ssh/config原因 这是因为.ssh文件夹或.ssh/config文件的权限异常,当前Windows账号没有读写权限导致的。 Windows系统重装&a…...
C++之序列容器(vector,list,dueqe)
1.大体对比 在软件开发的漫长历程中,数据结构与算法始终占据着核心地位,犹如大厦的基石,稳固支撑着整个程序的运行。在众多编程语言中,数据的存储与管理方式各有千秋,而 C 凭借其丰富且强大的工具集脱颖而出ÿ…...
安卓Android与iOS设备管理对比:企业选择指南
目录 一、管理方式差异 Android Enterprise方案包含三种典型模式: Apple MDM方案主要提供两种模式: 二、安全防护能力 Android系统特点: 三、应用管理方案 四、设备选择建议 五、典型场景推荐 需求场景 推荐方案 六、决策建议要点…...
git本地仓库链接远程仓库
重命名本地分支为main 如果你希望本地分支名称与远程分支名称保持一致,可以考虑将本地的master分支重命名为main。这可以通过以下命令完成: 在连接之前要先提交 git add . git commit -m "init" 强制推送到远程 git push -f origin main 首…...
版本控制器Git(1)
文章目录 前言一、初识Git问题引入解决方案注意事项 二、Git安装三、Git配置与基本操作Git创建Git配置用户名称和地址认识工作区、暂存区、版本库添加文件到仓库添加文件到暂存区提交暂存区内容到本地仓库 查看提交历史 四、Git 暂存区、HEAD、对象库及文件Git内部结构概览查看…...
推理模型对SQL理解能力的评测:DeepSeek r1、GPT-4o、Kimi k1.5和Claude 3.7 Sonnet
引言 随着大型语言模型(LLMs)在技术领域的应用日益广泛,评估这些模型在特定技术任务上的能力变得越来越重要。本研究聚焦于四款领先的推理模型——DeepSeek r1、GPT-4o、Kimi k1.5和Claude 3.7 Sonnet在SQL理解与分析方面的能力,…...
[动手学习深度学习]12.权重衰退
1.介绍 权重衰退是常见的处理过拟合的方法 控制模型容量方法 把模型控制的比较小,即里面参数比较少使参数选择范围小 约束就是正则项 每个特征的权重都大会导致模型复杂,从而导致过拟合。 控制权重矩阵范数可以使得减少一些特征的权重,甚至…...
JavaEE_多线程(二)
目录 1. 线程的状态2. 线程安全2.1 线程不安全问题的原因 3. 线程安全中的部分概念3.1 原子性3.2 可见性3.3 指令重排序 4. 解决线程安全问题4.1 synchronized关键字4.1.1 可重入4.1.2 synchronized使用 4.2 volatile关键字4.2.1 volatile使用 5. wait和notify5.1 wait()方法5.…...
【unity小技巧】分享vscode如何进行unity开发,且如何开启unity断点调试模式,并进行unity断点调试(2025年最新的方法,实测有效)
文章目录 前言一、前置条件1、已安装Visual Studio Code,并且unity首选项>外部工具>外部脚本编辑器选择为Visual Studio Code [版本号],2、在Visual Studio Code扩展中搜索Unity,并安装3、同时注意这个插件下面的描述,需要根…...
