C/C++中使用CopyFile、CopyFileEx原理、用法、区别及分别在哪些场景使用

文章目录

  • 1. CopyFile
    • 原理
    • 函数原型
    • 返回值
    • 用法示例
    • 适用场景
  • 2. CopyFileEx
    • 原理
    • 函数原型
    • 返回值
    • 用法示例
    • 适用场景
  • 3. 核心区别
  • 4. 选择建议
  • 5. 常见问题
  • 6.区别

在Windows系统编程中,CopyFileCopyFileEx是用于文件复制的两个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: 允许将未加密文件复制到未加密目标。

返回值

  • 如果函数成功,返回值为非零值。
  • 如果函数失败,返回值为零。可以使用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. 核心区别

特性CopyFileCopyFileEx
进度反馈不支持支持通过回调函数
操作中断无法取消可通过回调返回值或取消标志终止
复制模式仅基础复制支持重启模式(COPY_FILE_RESTARTABLE
适用文件大小小文件(<100MB)大文件(如GB级)
复杂度简单,参数少复杂,需处理回调和标志位

4. 选择建议

  • 优先 CopyFile:当需求简单、无需额外控制时,代码更简洁高效。
  • 必须用 CopyFileEx:若需要以下高级功能:
    • 用户界面中的进度条更新。
    • 允许用户取消耗时操作。
    • 断点续传或错误恢复机制。
    • 复制文件时保留更多元数据(如ACL)。

5. 常见问题

  • 跨卷复制:两者均支持,但CopyFileEx可通过标志优化。
  • 错误处理:均需检查返回值并通过GetLastError()获取错误码。
  • Unicode支持:实际开发中应使用CopyFileW/CopyFileExW处理宽字符路径。

6.区别

  1. 参数类型

    • CopyFile使用的是LPCSTR类型的字符串,即ANSI字符串。
    • CopyFileEx使用的是LPCTSTR类型的字符串,可以是ANSI或Unicode字符串。
  2. 功能

    • CopyFile是一个简单的文件复制函数,适合快速复制文件。
    • CopyFileEx提供了更多的功能,如进度回调、取消复制等,适合需要更复杂控制的场景。
  3. 灵活性

    • CopyFileExCopyFile更灵活,可以处理更大的文件,并且可以提供复制进度的反馈。
  4. 适用场景

    • CopyFile:适用于简单的文件复制操作,不需要进度反馈或复杂控制。
    • CopyFileEx:适用于需要实时监控复制进度、允许用户取消操作或处理大文件的场景。

通过合理选择这两个API,可以在功能复杂性和代码效率之间取得平衡。


此后为废话,纯粹是为了应对csdn质量分,没有任何价值,不要浏览。
在这里插入图片描述
更多学习资料


无论代码世界如何复杂,请记住:每一个“复制”的瞬间,都是向目标更进一步的印记。即使遇到“错误”与“中断”,只要心怀“重启”的勇气,终将在调试中突破,在坚持中抵达。愿你在技术的长路上,像CopyFileEx一样永不止步,以智慧为引,以耐心为伴,书写属于你的完美程序!
🚀 代码无涯,行者无疆——你的下一行,或许就是改变世界的起点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/983351.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机性能指标(计网笔记)

计算机性能指标&#xff1a;速率、带宽、吞吐率、时延、时延带宽积、往返时间RTT、利用率 速率 数据的传输速率&#xff0c;单位bit/s&#xff0c;或kbit/s&#xff0c;Mbit/s&#xff0c;Gbit/s 4*10**10bit/s40Gbit/s 常用带宽单位&#xff1a; 千比每秒kb/s 兆比每秒Mb/s…

Python基于Django的医用耗材网上申领系统【附源码、文档说明】

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…

php代码审计工具-rips

代码审计 代码审计就是检查所写的代码中是否有漏洞&#xff0c;检查程序的源代码是否有权限从而被黑客攻击&#xff0c;同时也检查了书写的代码是否规范。通过自动化的审查和人工审查的方式&#xff0c;逐行检查源代码&#xff0c;发现源代码中安全缺陷所造成的漏洞&#xff0…

工作学习笔记:HarmonyOS 核心术语速查表(v14 实战版)

作为在 HarmonyOS 开发一线摸爬滚打的工程师&#xff0c;笔者在 v14 版本迭代中整理了这份带血的实战术语表。 一、架构基础术语速查 A 系列术语 术语官方定义笔者解读&#xff08;v14 实战版&#xff09;开发陷阱 & 解决方案abc 文件ArkCompiler 生成的字节码文件打包时…

Trae IDE新建C#工程

目录 1 结论 2 项目结构 3 项目代码 1 结论 新建C#工程来说&#xff0c;Trae的Chat比DeepSeek的Coder好用。 2 项目结构 MyWinFormsApp/ │ ├── Program.cs ├── Form1.cs ├── Form1.Designer.cs ├── MyResources/ │ └── MyResources.resx └── MyWin…

大数据学习(55)-BI工具数据分析的使用

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 承认自己的无知&#xff0c;乃是开启智慧的大门 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博主哦&#x1f91…

Apache Kafka单节点极速部署指南:10分钟搭建开发单节点环境

Apache Kafka单节点极速部署指南&#xff1a;10分钟搭建开发单节点环境 Kafka简介&#xff1a; Apache Kafka是由LinkedIn开发并捐赠给Apache基金会的分布式流处理平台&#xff0c;现已成为实时数据管道和流应用领域的行业标准。它基于高吞吐、低延迟的设计理念&#xff0c;能够…

【干货教程】Windows电脑本地部署运行DeepSeek R1大模型(基于Ollama和Chatbox)

文章目录 一、环境准备二、安装Ollama2.1 访问Ollama官方网站2.2 下载适用于Windows的安装包2.3 安装Ollama安装包2.4 指定Ollama安装目录2.5 指定Ollama的大模型的存储目录 三、选择DeepSeek R1模型四、下载并运行DeepSeek R1模型五、常见问题解答六、使用Chatbox进行交互6.1 …

TCP/IP 5层协议簇:网络层(ICMP协议)

1. TCP/IP 5层协议簇 如下&#xff1a; 和ip协议有关的才有ip头 2. ICMP 协议 ICMP协议没有端口号&#xff0c;因为不去上层&#xff0c;上层协议采用端口号

STM32标准库代码详解之GPIO

GPIO的初始化代码如下&#xff1a; /*开启时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟&#xff0c;使用外设必须开启/*GPIO初始化*/ GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量 GPIO_InitStructure.GPIO_Mode GPIO_Mo…

【Spring AOP】_切点类的切点表达式

目录 1. 根据方法签名匹配编写切点表达式 1.1 具体语法 1.2 通配符表达规范 2. 根据注解匹配编写切点表达式 2.1 实现步骤 2.2 元注解及其常用取值含义 2.3 使用自定义注解 2.3.1 编写自定义注解MyAspect 2.3.2 编写切面类MyAspectDemo 2.3.3 编写测试类及测试方法 在…

利用EasyCVR平台打造化工园区视频+AI智能化监控管理系统

化工园区作为化工产业的重要聚集地&#xff0c;其安全问题一直是社会关注的焦点。传统的人工监控方式效率低下且容易出现疏漏&#xff0c;已经难以满足日益增长的安全管理需求。 基于EasyCVR视频汇聚平台构建的化工园区视频AI智能化应用方案&#xff0c;能够有效解决这些问题&…

FPGA学习篇——Verilog学习3(关键字+注释方法+程序基本框架)

1 Verilog常用关键字 大概知道以下哪些是关键字就好&#xff0c;如何使用还是得在编写代码中来学习。 2 Verilog注释方法 Verilog有两种注释方式&#xff1a; 2.1 “ // ” 单行。 2.2 “ /* ... */ ” 可扩展多行。 3 Verilog程序基本框架 Verilog 的基本设计单元是“…

扩展------项目中集成阿里云短信服务

引言 在当今数字化时代&#xff0c;短信服务在各种项目中扮演着重要角色&#xff0c;如用户注册验证、订单通知、营销推广等。阿里云短信服务凭借其稳定、高效和丰富的功能&#xff0c;成为众多开发者和企业的首选。本文将详细介绍如何在项目中集成阿里云短信服务&#xff0c;帮…

XHR请求解密:抓取动态生成数据的方法

在如今动态页面大行其道的时代&#xff0c;传统的静态页面爬虫已无法满足数据采集需求。尤其是在目标网站通过XHR&#xff08;XMLHttpRequest&#xff09;动态加载数据的情况下&#xff0c;如何精准解密XHR请求、捕获动态生成的数据成为关键技术难题。本文将深入剖析XHR请求解密…

STM32-I2C通信协议

目录 一&#xff1a;什么是I2C通信协议 二&#xff1a;I2C通信 三&#xff1a;I2C时序图 四&#xff1a;面试常见问题 一&#xff1a;什么是I2C通信协议 I2C&#xff08;Inter-Integrated Circuit&#xff09;协议是一种串口通信协议&#xff0c;用于在集成电路之间传输数…

Jenkins在Windows上的使用(一):用户配置

&#xff08;一&#xff09;下载jenkins和jdk 下载地址 https://www.jenkins.io/download/ jdk下载地址 https://www.oracle.com/java/technologies/downloads/安装jenkins的时候会提示需要的jdk版本&#xff08;二&#xff09;windows下创建用户账户 1. 创建jenkins用户 …

MQTT协议下温度数据上报观测云最佳实践

MQTT 介绍 MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;是一种轻量级的、基于发布/订阅模式的消息传输协议&#xff0c;专为低带宽、高延迟或不可靠的网络环境设计&#xff0c;广泛应用于物联网&#xff08;IoT&#xf…

立即释放 Mac 空间!Duplicate File Finder 8 重复文件高速清理工具

Duplicate File Finder 专业的 Mac 重复文件清理工具。查找并删除重复的文件、文件夹&#xff0c;甚至相似的照片。 不要让无用的文件占用磁盘上的宝贵空间。 整理你的 Mac。用最好的重复文件查找器来管理你的文件集合。 扫描任何磁盘或文件夹 主文件夹、照片/音乐库、外部磁…

一文对比RAGFLOW和Open WebUI【使用场景参考】

一、RAGFLOW与Open WebUI RAGFLOW是一款基于深度文档理解构建的开源 RAG&#xff08;Retrieval-Augmented Generation&#xff09;引擎。RAGFlow 可以为各种规模的企业及个人提供一套精简的 RAG 工作流程&#xff0c;结合大语言模型&#xff08;LLM&#xff09;针对用户各类不…