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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot 如何调用 WebService 接口

前言 调用WebService接口的方式有很多&#xff0c;今天记录一下&#xff0c;使用 Spring Web Services 调用 SOAP WebService接口 一.导入依赖 <!-- Spring Boot Web依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId…

tomcat单机多实例部署

一、部署方法 多实例可以运行多个不同的应用&#xff0c;也可以运行相同的应用&#xff0c;类似于虚拟主机&#xff0c;但是他可以做负载均衡。 方式一&#xff1a; 把tomcat的主目录挨个复制&#xff0c;然后把每台主机的端口给改掉就行了。 优点是最简单最直接&#xff0c;…

计算机视觉算法实战——老虎个体识别(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​​​ 1. 领域介绍 老虎个体识别是计算机视觉中的一个重要应用领域&#xff0c;旨在通过分析老虎的独特条纹图案&#xff0c;自动识别和区…

【数据结构】初识集合框架及背后的数据结构(简单了解)

目录 前言 如何学好数据结构 1. 什么是集合框架 2. 集合框架的重要性 3. 背后所涉及的数据结构以及算法 3.1 什么是数据结构 3.2 容器背后对应的数据结构 3.3 相关java知识 3.4 什么是算法 3.5 基本关系说明&#xff08;重要&#xff0c;简单了解&#xff09; 前言 …

Hadoop命令行语句

一、前言 1、启动虚拟机 2、连接工具 3、启动Hadoop并查询确保进程为51 start-all.shjps练习完请一定 stop-all.sh 关掉hadoop进程 关掉虚拟机 再关机电脑 二、Hadoop命令行主命令 1、进入Hadoop安装目录的bin路径 cd /training/hadoop-3.3.0/bin/2、查看低下的执行文…

TypeScript系列07-类型声明文件

在现代前端开发中&#xff0c;TypeScript已成为提升代码质量和开发体验的利器。对于React和React Native项目&#xff0c;合理利用类型声明文件不仅能提供更好的智能提示和类型检查&#xff0c;还能显著减少运行时错误。本文将深入探讨类型声明文件的编写与使用。 1. 声明文件…

迎接AI智能体新时代,推动新质生产力加快发展

随着人工智能技术的飞速发展&#xff0c;AI智能体正逐步成为推动新质生产力加快发展的重要力量。2025年&#xff0c;被业界普遍认为是AI智能体的爆发元年&#xff0c;这一技术范式的深刻变革&#xff0c;正重塑着人机关系&#xff0c;为各行各业带来前所未有的机遇与挑战。本文…

python: DDD using postgeSQL and SQL Server

postgreSQL 注意&#xff1a; # psycopg 2 驱动的连接字符串 #engine create_engine(postgresql://post:geovindulocalhost:5433/TechnologyGame) #Session sessionmaker(bindengine)# 使用 psycopg3 驱动的连接字符串 #engine create_engine(postgresqlpsycopg://user:g…

【redis】string类型相关操作:SET、GET、MSET、MGET、SETNX、SETEX、PSETEX

文章目录 二进制存储编码转换SET 和 GETSETGET MSET 和 MGETSETNX、SETEX 和 PSETEX Redis 所有的 key 都是字符串&#xff0c;value 的类型是存在差异的 二进制存储 Redis 中的字符串&#xff0c;直接就是按照二进制数据的方式存储的 不仅仅可以存储文本数据&#xff0c;还可…

嵌入式设备的功能安全和信息安全?

在现代社会中&#xff0c;嵌入式设备已经无处不在&#xff0c;从我们日常生活中的智能家居&#xff0c;到工业控制、医疗设备等各个行业&#xff0c;嵌入式设备的应用层出不穷。 那么&#xff0c;嵌入式设备的功能安全和信息安全究竟有什么不同&#xff0c;又如何保证它们在实…

爬虫案例七Python协程爬取视频

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Python协程爬取视频 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 爬虫案例七协程爬取视频 提示&#xff1a;以下是本篇文章正文…

【C++指南】一文总结C++类和对象【中】

&#x1f31f; 各位看官好&#xff0c;我是egoist2023&#xff01; &#x1f30d; 种一棵树最好是十年前&#xff0c;其次是现在&#xff01; &#x1f680; 今天来学习C类和对象的语法知识。注意&#xff1a;在本章节中&#xff0c;小编会以Date类举例 &#x1f44d; 如果觉得…

Python 入

Python 入侵交换机 随着网络安全威胁不断增加&#xff0c;对于网络设备的安全防护变得愈发重要。而交换机作为网络中重要的设备之一&#xff0c;也需要加强安全保护。本文将介绍如何利用Python来入侵交换机&#xff0c;并对其进行漏洞扫描和安全检测。 1. Python 入侵交换机原…

『PostgreSQL』PGSQL备份与还原实操指南

&#x1f4e3;读完这篇文章里你能收获到 了解逻辑备份与物理备份的区别及适用场景&#x1f50d;。掌握全库、指定库、指定表备份还原的命令及参数&#x1f4dd;。学会如何根据业务需求选择合适的备份策略&#x1f4ca;。熟悉常见备份还原问题的排查与解决方法&#x1f527;。 …

《Python实战进阶》No20: 网络爬虫开发:Scrapy框架详解

No20: 网络爬虫开发&#xff1a;Scrapy框架详解 摘要 本文深入解析Scrapy核心架构&#xff0c;通过中间件链式处理、布隆过滤器增量爬取、Splash动态渲染、分布式指纹策略四大核心技术&#xff0c;结合政府数据爬取与动态API逆向工程实战案例&#xff0c;构建企业级爬虫系统。…

Spring Boot整合WebSocket

目录 ?引言 1.WebSocket 基础知识 ?1.1 什么是 WebSocket&#xff1f; ?1.2 WebSocket 的应用场景 ?2.Spring Boot WebSocket 整合步骤 2.1 创建 Spring Boot 项目 2.2 添加 Maven 依赖 2.3 配置 WebSocket 2.4 创建 WebSocket 控制器 2.5 创建前端页面 引言 在…

《OkHttp:工作原理 拦截器链深度解析》

目录 一、OKHttp 的基本使用 1. 添加依赖 2. 发起 HTTP 请求 3. 拦截器&#xff08;Interceptor&#xff09; 4. 高级配置 二、OKHttp 核心原理 1. 责任链模式&#xff08;Interceptor Chain&#xff09; 2. 连接池&#xff08;ConnectionPool&#xff09; 3. 请求调度…

【前端】BOM DOM

两天更新完毕&#xff0c;建议关注收藏点赞 友情链接&#xff1a; HTML&CSS&LESS&Bootstrap&Emmet Axios & AJAX & Fetch BOM DOM 待整理 js2 Web API 是浏览器提供的一套操作浏览器功能和页面元素的 API ( BOM 和 DOM)。官方文档点击跳转 目录 BOMDOM…

产品需求分析-概览

产品需求分析-概览 产品需求分析(上)-理论流程 需求产生(来源) 公司内部(老板、其他部门同事)产品经理自己(策划、挖掘)外部(用户、客户、伙伴) 需求分类 功能类数据类运营类体验类设计类 需求决策 战略定位产品定位用户需求 需求分位&#xff1a;四象限定位法 重要又…

小程序事件系统 —— 32 事件系统 - 事件分类以及阻止事件冒泡

在微信小程序中&#xff0c;事件分为 冒泡事件 和 非冒泡事件 &#xff1a; 冒泡事件&#xff1a;当一个组件的事件被触发后&#xff0c;该事件会向父节点传递&#xff1b;&#xff08;如果父节点中也绑定了一个事件&#xff0c;父节点事件也会被触发&#xff0c;也就是说子组…