当前位置: 首页 > news >正文

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: 允许将未加密文件复制到未加密目标。
    • 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. 核心区别

特性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一样永不止步,以智慧为引,以耐心为伴,书写属于你的完美程序!
🚀 代码无涯,行者无疆——你的下一行,或许就是改变世界的起点。

相关文章:

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

文章目录 1. CopyFile原理函数原型返回值用法示例适用场景 2. CopyFileEx原理函数原型返回值用法示例适用场景 3. 核心区别4. 选择建议5. 常见问题6.区别 在Windows系统编程中&#xff0c;CopyFile和CopyFileEx是用于文件复制的两个API函数。它们的核心区别在于功能扩展性和控制…...

android studio开发文档

android基本样式 1.文本 2.设置文本大小 3.字体颜色 背景 资源文件 xml’引用资源文件 4.视图宽高 5.间距 6.对齐方式 常用布局 1.linearLayout线性布局 2.相对布局 RelativeLayout 3.网格布局GridLayout 4.scrollview滚动视图 Button 点击事件与长按事件 长按 按钮禁用与…...

计算机网络笔记(二)——1.2互联网概述

1.2.1网络的网络 起源于美国的互联网现已发展成为世界上最大的覆盖全球的计算机网络。 下面&#xff0c;我们先来看看关于网络、互连网、互联网(因特网)的一些基本概念。为了方便&#xff0c;后面我们所称呼的"网络"往往就是"计算机网络",而不是电信网或有…...

Ubuntu 24.04.2 允许 root 登录桌面、 ssh 远程、允许 Ubuntu 客户机与主机拖拽传递文件

允许 root 登录桌面 修改 /etc/pam.d/gdm-autologin , /etc/pam.d/gdm-password 加 # 以注释掉 auth required pam_succeed_if.so user ! root quiet_success 允许 root 通过 ssh 登录 修改 /etc/ssh/sshd_config ... #PermitRootLogin prohibit-password PermitRootLogin …...

day18-后端Web开发——Maven高级

目录 Maven高级1. 分模块设计与开发1.1 介绍1.2 实践1.2.1 分析1.2.2 实现 1.3 总结 2. 继承与聚合2.1 继承2.1.1 继承关系2.1.1.1 思路分析2.1.1.2 实现2.1.2 版本锁定2.1.2.1 场景2.1.2.2 介绍2.1.2.3 实现2.1.2.4 属性配置 2.2 聚合2.2.1 介绍2.2.2 实现 2.3 继承与聚合对比…...

华为hcia——Datacom实验指南——三层交换和ARP的工作原理

什么是三层交换 三层交换是指连接在同一台三层交换机上&#xff0c;不同vlan用户&#xff0c;不同网段ip&#xff0c;通过vlanif接口进行数据交换。 什么是ARP协议 通过网络层的ip地址解析成数据链路层的mac地址。 说白了就是通过目标ip地址去问他对应的mac地址是多少。 A…...

重构谷粒商城09:人人开源框架的快速入门

谷粒商城09——人人开源框架的快速入门 前言&#xff1a;这个系列将使用最前沿的cursor作为辅助编程工具&#xff0c;来快速开发一些基础的编程项目。目的是为了在真实项目中&#xff0c;帮助初级程序员快速进阶&#xff0c;以最快的速度&#xff0c;效率&#xff0c;快速进阶…...

用友 U8出入库查询SQL 连接UNION ALL

-- 销售出库单查询 SELECT 销售出库单 AS 单据类型, a.cCode AS 单号, a.dDate AS 日期, a.cMaker AS 制单人, a.cHandler AS 审核人, a.dVeriDate AS 审核日期, b.cInvCode AS 存货编码, b.iQuantity AS 数量, b.cBatch AS 批号, c.…...

【大模型】WPS 接入 DeepSeek-R1详解,打造全能AI办公助手

目录 一、前言 二、WPS接入AI工具优势​​​​​​​ 三、WPS接入AI工具两种方式 3.1 手动配置的方式 3.2 Office AI助手 四、WPS手动配置方式接入AI大模型 4.1 安装VBA插件 4.1.1 下载VBA插件并安装 4.2 配置WPS 4.3 WPS集成VB 4.4 AI助手效果测试 4.5 配置模板文…...

Neo4j 数据库备份

将包括系统数据库在内的所有数据库的最近备份存储在一个安全的位置是非常重要的。这确保了在发生数据丢失或损坏时&#xff0c;能够迅速恢复数据库到最近的状态&#xff0c;减少可能的业务影响。对于不同的数据库环境&#xff08;开发、测试或生产&#xff09;&#xff0c;根据…...

配置 Thunderbird 以使用 QQ 邮箱

配置 Thunderbird 以使用 QQ 邮箱 本片文章的操作系统为 windws 10 &#xff0c;thunder bird 客户端版本为 128.7.1esr(64位)。注意到其他文章的图片中 thunder bird 的 ui 界面和我这个不一样&#xff0c;导致看起来不太方便&#xff0c;所以这里写一篇博客。不同版本的 thu…...

Hadoop安装文件解压报错:无法创建符号链接。。。

您可能需要管理员身份运行winRAR; 客户端没有所需的特权&#xff1b; cmd进入该目录下&#xff0c;输入命令(本地解压)&#xff1a;start winrar x -y hadoop-2.10.1.tar.gz...

C++蓝桥杯皮亚诺曲线距离求解

C蓝桥杯皮亚诺曲线距离求解 一、题目概述二、解题分析2.1解题思路2.2k值范围限制 三、实现代码四、代码测试4.1蓝桥杯测试平台4.2直接传入原始输入的k值4.3限制k值大小4.4pow函数求整数高次幂存在误差4.5满分代码 附录error: ‘long long int y1’ redeclared as different kin…...

【语料数据爬虫】Python爬虫|批量采集工作报告数据(1)

前言 本文是该专栏的第4篇,后面会持续分享Python爬虫采集各种语料数据的的干货知识,值得关注。 在本文中,笔者将主要来介绍基于Python,来实现批量采集“工作报告”数据。同时,本文也是采集“工作报告”数据系列的第1篇。 采集相关数据的具体细节部分以及详细思路逻辑,笔…...

【音视频】ffmpeg命令提取像素格式

1、提取YUV数据 提取yuv数据&#xff0c;并保持分辨率与原视频一致 使用-pix_fmt或-pixel_format指定yuv格式提取数据&#xff0c;并保持原来的分辨率 ffmpeg -i music.mp4 -t "01:00" -pixel_format yuv420p music.yuv提取成功后&#xff0c;可以使用ffplay指定y…...

6-langchang多模态输入和自定义输出

6-langchang多模态输入和自定义输出 多模态数据输入urlbase64url list工具调用自定义输出: JSON, XML, YAML如何解析 JSON 输出json如何解析xmlYAML解析器多模态数据输入 这里我们演示如何将多模态输入直接传递给模型。我们目前期望所有输入都以与OpenAI 期望的格式相同的格式…...

STM32上跑SimpleFOC,电流环、速度环、位置环、棘轮软硬件全开源

引入 我之前写过不少SVPWM、FOC的介绍文章&#xff0c;比如&#xff1a; SVPWM算法原理及详解 从电机本质到park变换再到SVPWM&#xff0c;SVPWM代码实现 电机FOC算法的解释 FOC和SVPWM的C语言代码实现 simple foc可以看成是他们的简化版本。本来simple foc是跑在arduino上的…...

智慧锂电:开启能源新时代的钥匙

在科技日新月异的今天&#xff0c;智慧锂电正以其独特的魅力&#xff0c;引领着能源领域的新变革。智慧锂电不仅革新了传统电池技术&#xff0c;更以其智能化、高效化的特性&#xff0c;成为推动能源管理现代化的重要力量。 智慧锂电项目&#xff1a;点亮绿色转型之路 智慧锂电…...

密码学 网络安全 科普 网络安全密码技术

网络加密包括密码技术和网络加密方法两个方面。 一、 密码技术   密码技术一般分为常规密码和公钥密码。   常规密码是指收信方和发信方使用相同的密钥&#xff0c;即加密密钥和解密密钥是相同或等价的。比较著名的常规密码算法有DES及其各种变形、IDEA、FEAL、Skipjack…...

C# BlockingCollection

什么是 BlockingCollection<T>主要特点构造函数常用方法生产者操作消费者操作 示例代码注意事项串口接收底层存储的类型线程安全和并发访问串口数据接收的顺序性关键点 BlockingCollection<T> 是 C# 中一个非常有用的线程安全集合类&#xff0c;位于 System.Coll…...

学习笔记11——并发编程之并发关键字

并发关键字 synchronized关键字 在应用Sychronized关键字时需要把握如下注意点&#xff1a; 1.一把锁只能同时被一个线程获取&#xff0c;没有获得锁的线程只能等待&#xff1b; 2.每个实例都对应有自己的一把锁(this),不同实例之间互不影响&#xff1b;例外&#xff1a;锁…...

2.2 Windows本地部署DeepSeek模型 --- Ollama篇(下)

2.3Ollama加载已下载Deepseek模型 无网络连接&#xff0c;直接通过Ollama本地已经本地已经下载好的的Deepseek模型。 2.3.1 查看已安装模型 PS C:\Users\Administrator> ollama list NAME ID SIZE MODIFIED deepseek-r1:8…...

DeepSeek R1-32B医疗大模型的完整微调实战分析(全码版)

DeepSeek R1-32B微调实战指南 ├── 1. 环境准备 │ ├── 1.1 硬件配置 │ │ ├─ 全参数微调:4*A100 80GB │ │ └─ LoRA微调:单卡24GB │ ├── 1.2 软件依赖 │ │ ├─ PyTorch 2.1.2+CUDA │ │ └─ Unsloth/ColossalAI │ └── 1.3 模…...

mysql的锁--一篇读懂所有锁机制

目录 mysql的锁 概述&#xff1a;根据mysql锁的大类型可以分为 我们先来讲一下范围最大的全局锁 使用 为什么要使用全局锁&#xff1f; 使用全局锁进行备份的缺点 表级锁 表锁 1.共享读表锁的语法 2.排斥写表锁 元数据锁 意向锁 什么是意向锁 怎么产生意向锁 意向…...

LTC6804、LTC6811、LTC6813的使用

FSEC自制BMS第一步&#xff1a;从零开发使用LTC6804采集电池电压 LTC6811特性 LTC6811 是 LTC6804 的引脚兼容型升级器件&#xff0c;LTC6804官方已经不推荐选用 可测量多达 12 节串联电池 1.2mV 最大总测量误差 可堆叠式架构能支持几百个电池 内置 isoSPI™ 接口 可在 290μ…...

linux内存页块划分及位图存储机制

page_alloc.c - mm/page_alloc.c - Linux source code v5.4.285 - Bootlin Elixir Cross Referencer 一. 什么是页块&#xff08;Pageblock&#xff09;&#xff1f; 定义&#xff1a;页块是物理内存中的一个连续区域&#xff0c;由 2^pageblock_order 个物理页&#xff08;Pag…...

Vue 文件下载功能的跨域处理与前后端实现详解

在 Web 应用开发中&#xff0c;文件下载功能是常见需求。但由于跨域限制和认证机制的复杂性&#xff0c;实际开发中常遇到下载失败或权限错误等问题。本文将结合 Vue 前端和 Spring Boot 后端&#xff0c;详细介绍文件下载功能的实现与跨域问题的解决方案。 一、问题背景 在某…...

boost::beast websocket 实例

环境&#xff1a;ubuntu 1. 安装boost sudo apt install -y libboost-all-dev 2. Server端 #include <boost/asio.hpp> #include <boost/beast.hpp> #include <iostream> #include <thread>namespace beast boost::beast; // 从 Boost.Beast 中导…...

复试难度,西电卓越工程师学院(杭研院)考研录取情况

01、卓越工程师学院各个方向 02、24卓越工程师学院&#xff08;杭研院&#xff09;近三年复试分数线对比 PS&#xff1a;卓越工程师学院分为广研院、杭研院 分别有新一代电子信息技术、通信工程、集成电路工程、计算机技术、光学信息工程、网络信息安全、机械&#xff0c;这些…...

Rabbitmq--延迟消息

13.延迟消息 延迟消息&#xff1a;生产者发送消息时指定一个时间&#xff0c;消费者不会立刻收到消息&#xff0c;而是在指定时间之后才会收到消息 延迟任务&#xff1a;一定时间之后才会执行的任务 1.死信交换机 当一个队列中的某条消息满足下列情况之一时&#xff0c;就会…...