Windows C++:MoveFile、MoveFileEx、MoveFileWithProgress、CopyFile、CopyFileEx。

   

目录

一、MoveFile

参数

返回值

使用示例

注意事项

二、MoveFileEx

参数

返回值

使用示例

三、MoveFileWithProgress

参数

返回值

使用示例

注意事项

四、CopyFile

参数

返回值

使用示例

注意事项

五、CopyFileEx

参数

返回值

使用示例

注意事项

六、总结


     

        MoveFile、MoveFileEx、MoveFileWithProgress、CopyFile、CopyFileEx,这些函数在文件和目录的创建、删除、移动、查找等操作中提供了额外的功能和灵活性,能够帮助开发者进行更复杂的文件管理任务。

一、MoveFile

BOOL MoveFile(LPCTSTR lpExistingFileName, // 要移动或重命名的现有文件的名称LPCTSTR lpNewFileName        // 新文件名或目标文件的名称
);

参数

  • lpExistingFileName: 指向一个以 null 结尾的字符串,指定要移动或重命名的现有文件的路径。
  • lpNewFileName: 指向一个以 null 结尾的字符串,指定新文件名或目标路径。如果目标路径在不同的目录中,文件将被移动到该目录;如果在同一目录中,文件将被重命名。

返回值

  • 如果函数成功,返回值为非零值。
  • 如果函数失败,返回值为零。可以调用 GetLastError 函数获取更多错误信息。

使用示例

        下面是一个示例,展示如何使用 MoveFile 函数将文件从一个位置移动到另一个位置。

#include <windows.h>
#include <iostream>void MoveFileExample() {LPCSTR existingFileName = "C:\\Temp\\example.txt"; // 现有文件路径LPCSTR newFileName = "C:\\Temp\\new_example.txt";  // 新文件路径// 尝试移动文件if (MoveFile(existingFileName, newFileName)) {std::cout << "文件移动成功!" << std::endl;} else {std::cout << "文件移动失败,错误代码: " << GetLastError() << std::endl;}
}int main() {MoveFileExample();return 0;
}

注意事项

  • 确保程序有足够的权限访问指定的文件和目录。
  • 如果目标文件已经存在,MoveFile 将失败。可以使用 MoveFileEx 函数并结合 MOVEFILE_REPLACE_EXISTING 标志来替换目标文件。

二、MoveFileEx

   MoveFileEx 函数用于移动文件或文件夹,并提供额外选项,如在重启时删除文件。

BOOL MoveFileEx(LPCTSTR lpExistingFileName, // 要移动的现有文件或文件夹的名称LPCTSTR lpNewFileName        // 新文件名或目标文件夹的名称DWORD dwFlags                // 操作标志
);

参数

  • lpExistingFileName: 指向一个以 null 结尾的字符串,指定要移动的现有文件或文件夹的路径。
  • lpNewFileName: 指向一个以 null 结尾的字符串,指定新的文件名或目标文件夹的路径。
  • dwFlags: 操作标志,决定函数的行为。常用标志包括:
    • MOVEFILE_REPLACE_EXISTING: 如果目标文件已存在,则替换它。
    • MOVEFILE_DELAY_UNTIL_REBOOT: 将文件标记为在下次重启时删除。
    • MOVEFILE_WRITE_THROUGH: 确保所有写入操作在返回之前完成。

返回值

  • 如果函数成功,返回值为非零值。
  • 如果函数失败,返回值为零。可以使用 GetLastError 获取更多错误信息。

使用示例

以下示例演示如何使用 MoveFileEx 函数将文件移动到新位置,同时使用标志。

#include <windows.h>
#include <iostream>void MoveFileExExample() {LPCSTR existingFileName = "C:\\Temp\\example.txt"; // 现有文件路径LPCSTR newFileName = "C:\\Temp\\new_example.txt";   // 新文件路径// 尝试移动文件并替换现有文件if (MoveFileEx(existingFileName, newFileName, MOVEFILE_REPLACE_EXISTING)) {std::cout << "文件移动成功!" << std::endl;} else {std::cout << "文件移动失败,错误代码: " << GetLastError() << std::endl;}// 如果要在重启时删除文件// MoveFileEx(existingFileName, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
}int main() {MoveFileExExample();return 0;
}

        

        以下是使用 MOVEFILE_DELAY_UNTIL_REBOOT 标志的代码示例,它将指定的文件标记为在下次重启时删除。

#include <windows.h>
#include <iostream>void DeleteFileOnRebootExample() {LPCSTR fileToDelete = "C:\\Temp\\example.txt"; // 要在重启时删除的文件路径// 尝试将文件标记为在下次重启时删除if (MoveFileEx(fileToDelete, NULL, MOVEFILE_DELAY_UNTIL_REBOOT)) {std::cout << "文件已标记为在重启时删除!" << std::endl;} else {std::cout << "标记文件删除失败,错误代码: " << GetLastError() << std::endl;}
}int main() {DeleteFileOnRebootExample();return 0;
}

三、MoveFileWithProgress

 MoveFileWithProgress 函数用于移动文件,并允许提供进度反馈。

BOOL MoveFileWithProgress(LPCTSTR lpExistingFileName,       // 要移动的现有文件的名称LPCTSTR lpNewFileName              // 新文件名或目标文件的名称LPPROGRESS_ROUTINE lpProgressProc, // 指向进度例程的指针LPVOID lpData                      // 传递给进度例程的数据DWORD dwFlags                      // 操作标志
);

参数

  • lpExistingFileName: 指向一个以 null 结尾的字符串,指定要移动的现有文件的路径。
  • lpNewFileName: 指向一个以 null 结尾的字符串,指定新的文件名或目标文件的路径。
  • lpProgressProc: 指向一个回调函数(进度例程)的指针,用于接收进度更新。
  • lpData: 指向用户定义的数据,可以传递给进度例程。
  • dwFlags: 操作标志,例如 MOVEFILE_COPY_ALLOWED

 

返回值

  • 如果函数成功,返回值为非零值。
  • 如果函数失败,返回值为零。可以使用 GetLastError 获取更多错误信息。

使用示例

        以下示例演示如何使用 MoveFileWithProgress 函数移动文件并实现进度反馈。

#include <windows.h>
#include <iostream>// 进度回调函数
DWORD CALLBACK ProgressRoutine(LARGE_INTEGER TotalFileSize,LARGE_INTEGER TotalBytesTransferred,LARGE_INTEGER StreamSize,LARGE_INTEGER StreamBytesTransferred,DWORD dwStreamNumber,DWORD dwCallbackReason,HANDLE hSourceFile,HANDLE hDestinationFile,DWORD dwData)
{// 输出进度信息double percent = (static_cast<double>(TotalBytesTransferred.QuadPart) / TotalFileSize.QuadPart) * 100.0;std::cout << "已移动: " << TotalBytesTransferred.QuadPart << " 字节 (" << percent << "%)" << std::endl;return PROGRESS_CONTINUE; // 继续移动
}void MoveFileWithProgressExample() {LPCSTR existingFileName = "C:\\Temp\\example.txt"; // 现有文件路径LPCSTR newFileName = "C:\\Temp\\new_example.txt";   // 新文件路径// 尝试移动文件并提供进度反馈if (MoveFileWithProgress(existingFileName, newFileName, ProgressRoutine, NULL, MOVEFILE_COPY_ALLOWED)) {std::cout << "文件移动成功!" << std::endl;} else {std::cout << "文件移动失败,错误代码: " << GetLastError() << std::endl;}
}int main() {MoveFileWithProgressExample();return 0;
}

注意事项

  • 确保程序有足够的权限访问指定的文件和目录。
  • 进度回调函数可以根据需要进行扩展,以实现更多功能(例如,取消操作)。

四、CopyFile

  CopyFile 函数用于复制文件。

BOOL CopyFile(LPCTSTR lpExistingFileName, // 要复制的现有文件的名称LPCTSTR lpNewFileName,      // 新文件的名称BOOL bFailIfExists          // 如果目标文件已存在,是否失败
);

参数

  • lpExistingFileName: 指向一个以 null 结尾的字符串,指定要复制的现有文件的路径。
  • lpNewFileName: 指向一个以 null 结尾的字符串,指定新文件的路径。
  • bFailIfExists: 如果该参数为 TRUE,并且目标文件已存在,则函数将失败。如果为 FALSE,目标文件将被覆盖。

 

返回值

  • 如果函数成功,返回值为非零值。
  • 如果函数失败,返回值为零。可以使用 GetLastError 获取更多错误信息。

使用示例

        以下示例演示如何使用 CopyFile 函数复制文件。

#include <windows.h>
#include <iostream>void CopyFileExample() {LPCSTR existingFileName = "C:\\Temp\\example.txt"; // 现有文件路径LPCSTR newFileName = "C:\\Temp\\copy_of_example.txt"; // 新文件路径// 尝试复制文件if (CopyFile(existingFileName, newFileName, FALSE)) {std::cout << "文件复制成功!" << std::endl;} else {std::cout << "文件复制失败,错误代码: " << GetLastError() << std::endl;}
}int main() {CopyFileExample();return 0;
}

注意事项

  • 确保程序有足够的权限访问指定的文件和目录。
  • 如果目标文件已存在并且 bFailIfExists 参数为 TRUE,复制操作将失败;如果为 FALSE,目标文件将被覆盖。

 

五、CopyFileEx

  CopyFileEx 函数用于复制文件,并提供进度反馈和取消操作的功能。

BOOL CopyFileEx(LPCTSTR lpExistingFileName,         // 要复制的现有文件的名称LPCTSTR lpNewFileName,              // 新文件的名称LPPROGRESS_ROUTINE lpProgressProc,  // 指向进度例程的指针LPVOID lpData                       // 传递给进度例程的数据DWORD dwCopyFlags                   // 操作标志
);

参数

  • lpExistingFileName: 指向一个以 null 结尾的字符串,指定要复制的现有文件的路径。

  • lpNewFileName: 指向一个以 null 结尾的字符串,指定新文件的路径。

  • lpProgressProc: 指向一个回调函数的指针,允许在复制过程中接收进度更新。该函数可以提供实时反馈。

  • lpData: 指向用户定义的数据,可以在进度例程中使用。可以传递任何您需要的信息,通常是用于传递上下文信息的指针。

  • dwCopyFlags: 操作标志,决定复制操作的行为。常用标志包括:

    • COPY_FILE_FAIL_IF_EXISTS: 如果目标文件已存在,复制操作将失败。
    • COPY_FILE_RESTARTABLE: 创建可以恢复的复制操作。
    • COPY_FILE_OPEN_SOURCE_FOR_WRITE: 允许源文件在复制过程中被写入。
    • COPY_FILE_ALLOW_DECRYPTED_DESTINATION: 允许将未加密文件复制到未加密目标。

返回值

  • 如果函数成功,返回值为非零值。
  • 如果函数失败,返回值为零。可以使用 GetLastError 获取更多错误信息。

使用示例

        以下示例演示如何使用 CopyFileEx 函数复制文件并提供进度反馈。

#include <windows.h>
#include <iostream>// 进度回调函数
DWORD CALLBACK ProgressRoutine(LARGE_INTEGER TotalFileSize,LARGE_INTEGER TotalBytesTransferred,LARGE_INTEGER StreamSize,LARGE_INTEGER StreamBytesTransferred,DWORD dwStreamNumber,DWORD dwCallbackReason,HANDLE hSourceFile,HANDLE hDestinationFile,DWORD dwData)
{// 输出进度信息double percent = (static_cast<double>(TotalBytesTransferred.QuadPart) / TotalFileSize.QuadPart) * 100.0;std::cout << "已复制: " << TotalBytesTransferred.QuadPart << " 字节 (" << percent << "%)" << std::endl;return PROGRESS_CONTINUE; // 继续复制
}void CopyFileExExample() {LPCSTR existingFileName = "C:\\Temp\\example.txt"; // 现有文件路径LPCSTR newFileName = "C:\\Temp\\copy_of_example.txt"; // 新文件路径// 尝试复制文件并提供进度反馈if (CopyFileEx(existingFileName, newFileName, ProgressRoutine, NULL, NULL, 0)) {std::cout << "文件复制成功!" << std::endl;} else {std::cout << "文件复制失败,错误代码: " << GetLastError() << std::endl;}
}int main() {CopyFileExExample();return 0;
}

注意事项

  • 确保程序有足够的权限访问指定的文件和目录。
  • 进度回调函数可以根据需要进行扩展,以实现更多功能(例如,取消操作)。

六、总结

        文件管理是一个至关重要的领域,涉及文件的创建、移动、复制和删除等操作。本文介绍了五个关键的 Windows API 函数:MoveFileMoveFileExMoveFileWithProgressCopyFileCopyFileEx,这些函数在实现高效的文件操作时,提供了丰富的功能和灵活性。

  MoveFile 是最基本的文件移动函数,允许开发者轻松地将文件或目录移动到指定位置或重命名。尽管功能简单,但它的有效性在于易用性,适合进行快速的文件操作。然而,它的局限性在于无法处理已存在的目标文件,这为更复杂的应用场景带来了挑战。

        为了解决这个问题,MoveFileEx 提供了更高的灵活性,不仅支持替换现有文件,还能设置在系统重启后删除文件的选项。这样的特性对于需要在文件被占用或锁定时进行管理的应用程序尤为重要,开发者可以通过这个函数来实现更复杂的逻辑,确保系统的稳定性和文件的完整性。

   MoveFileWithProgress 则在移动文件时引入了进度反馈机制,使开发者能够实时监控文件移动的状态。这在处理大文件时尤为重要,因为用户可以通过进度反馈了解操作的进展,避免因长时间的等待而产生的不安。这种交互性极大提升了用户体验,使得文件操作不再是一个“黑箱”过程。

        在复制文件方面,CopyFileCopyFileEx 提供了类似的功能。前者以简单直接的方式实现文件复制,但缺乏进度反馈和更高级的控制。而 CopyFileEx 则弥补了这一不足,通过提供进度回调函数,开发者可以在复制过程中获取实时反馈。这在复制大文件或在网络环境下复制文件时尤其重要,因为可以实现对操作的动态监控和用户交互。

        总结来说,这些 API 函数为开发者提供了强大的工具,能够高效地管理文件和目录操作。无论是基本的文件移动、复杂的文件替换还是在长时间操作中的进度反馈,这些函数都为实现优雅而灵活的文件管理解决方案奠定了基础。在实际开发中,正确地选择和使用这些函数,不仅能够提升应用程序的性能,还能极大地改善用户体验。因此,理解这些函数的使用场景、优缺点及其适用性,对于每一位软件开发者来说,都是必不可少的技能。通过深入掌握这些 API,开发者能够在日益复杂的文件操作中游刃有余,实现更加流畅和高效的应用程序。

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

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

相关文章

论文阅读:A Generalization of Transformer Networks to Graphs

论文阅读&#xff1a;A Generalization of Transformer Networks to Graphs 论文地址1 摘要2 贡献Graph TransformerOn Graph Sparsity&#xff08;图稀疏&#xff09;On Positional Encodings&#xff08;位置编码&#xff09;3 Graph Transformer Architecture&#xff08;架…

C++:日期类的实现

目录 一、前言 二、头文件 三、各个函数的实现 打印、检查日期及获取日期 、、-、-、 、<、<、>、>、 &#xff01; 日期-日期 >>、<< 一、前言 前面几篇讲了关于类和对象的一些知识&#xff0c;本篇就来实现一下前面用到的日期类。 二、头文…

市面第一款 C++ 版本的U盘装机软件(即将上线)

市面大部分U盘装机软件&#xff0c;都是采用Au3脚本开发&#xff0c;而且有各种捆绑&#xff0c;闲来无聊&#xff0c;采用Qt C制作一款CU盘装机软件&#xff0c;从此告别Au3脚本&#xff0c;各种炫酷界面随便换&#xff0c;敬请期待 另外两个界面暂时不公布&#xff0c;防止Au…

uni-app页面调用接口和路由(四)

文章目录 一、路由二、页面调用接口二、路由跳转1.uni.navigateTo(OBJECT)2.uni.redirectTo(OBJECT)3.uni.reLaunch(OBJECT)4.uni.switchTab(OBJECT)5.uni.navigateBack(OBJECT) 总结 一、路由 路由配置 uni-app页面路由为框架统一管理&#xff0c;开发者需要在pages.json里配…

Linux —— Socket编程(一)

一、本篇重点 1. 认识IP地址、端口号、网络字节序等网络编程中的基本概念 2. 学习Socket api的基本用法 3. 能够实现一个简单的udp客户端/服务器 二、基本概念 1. 理解源IP地址和目的IP地址 简单的理解&#xff0c;IP地址是用于标识一台机器的&#xff0c;我们通过IP地址去…

Springboot常见问题(bean找不到)

如图错误显示userMapper bean没有找到。 解决方案&#xff1a; mapper包位置有问题&#xff1a;因为SpringBoot默认的包扫描机制会扫描启动类所在的包同级文件和子包下的文件。注解问题&#xff1a; 比如没有加mapper注解 然而无论是UserMapper所在的包位置还是Mapper注解都是…

大数据Hologres(一):Hologres 简单介绍

文章目录 Hologres 简单介绍 一、什么是实时数仓 Hologres 二、产品优势 1、专注实时场景 2、亚秒级交互式分析 3、统一数据服务出口 4、开放生态 5、MaxCompute查询加速 6、计算存储分离架构 三、应用场景 搭建实时数仓 四、产品架构 1、Shared Disk/Storage &am…

ER 图 Entity-Relationship (ER) diagram 101 电子商城 数据库设计

起因&#xff0c; 目的: 客户需求, 就是要设计一个数据库。 过程&#xff0c; 关于工具: UI 设计&#xff0c;我最喜欢的工具其实是 Canva, 但是 Canva 没有合适的模板。我用的是 draw.io, 使用感受是&#xff0c;很垃圾。 各种快捷键不适应&#xff0c;箭头就是点不住&…

OpenCV4.8 开发实战系列专栏之 01- 环境搭建与图像读写

大家好&#xff0c;欢迎大家学习OpenCV4.8 开发实战专栏&#xff0c;长期更新&#xff0c;不断分享源码。 专栏代码全部基于C 与Python双语演示&#xff0c;专栏答疑群 请联系微信 OpenCVXueTang_Asst 本文关键知识点&#xff1a; 开发环境搭建、读取图像与显示图像,读取图像…

【笔记篇】一篇文章搞定Spring框架

文章目录 前言一、Spring框架的优势 二、 Spring的使用流程Spring的依赖注入bean后处理器容器后处理器FileSystemResource类Spring的AOP机制AOP基础知识AOP应用案例Spring的事务管理事务控制参数事务的隔离级别 总结 前言 学习完了Spring框架&#xff0c;总结回顾一下。 一、…

使用vite+react+ts+Ant Design开发后台管理项目(三)

前言 本文将引导开发者从零基础开始&#xff0c;运用vite、react、react-router、react-redux、Ant Design、less、tailwindcss、axios等前沿技术栈&#xff0c;构建一个高效、响应式的后台管理系统。通过详细的步骤和实践指导&#xff0c;文章旨在为开发者揭示如何利用这些技术…

工程师 - Windows下打开PowerShell和CMD Prompt的若干方法

打开PowerShell 在Windows中&#xff0c;你可以通过以下几种方式来打开PowerShell&#xff1a; 1. 开始菜单&#xff08;Start Menu&#xff09;&#xff1a;点击“开始”按钮&#xff0c;然后在搜索栏中输入“PowerShell”。在搜索结果中&#xff0c;选择“Windows PowerShell…

夹耳式蓝牙耳机哪个牌子最好?夹耳式耳机推荐性价比排行榜

耳夹式耳机既不堵耳孔、也不需要包覆耳廓&#xff0c;佩戴时看起来更像是一个“耳环”&#xff0c;固定方式也类似“夹耳朵”。不过&#xff0c;它并不是真的夹住了耳朵肉&#xff0c;而是半夹、半挂——依靠耳廓边缘厚、里面薄&#xff0c;且有一定的弯折面的特殊构造&#xf…

网络层协议 —— IP协议

目录 0.前言 1.IP协议的格式 2.IP地址 2.1IP地址的划分 国际间IP地址的划分 公有IP 私有IP 特殊的IP地址 国内IP地址的划分 2.2IP地址不足问题 2.3IP地址的功能 2.4如何使用IP地址 2.5IP地址的构成 3.网段划分 以前的方案 现在的方案 4.认识宏观网络 5.路由 …

边缘智能-大模型架构初探

R2Cloud接口 机器人注册 请求和应答 注册是一个简单的 HTTP 接口&#xff0c;根据机器人/用户信息注册&#xff0c;创建一个新机器人。 请求 URL URLhttp://ip/robot/regTypePOSTHTTP Version1.1Content-Typeapplication/json 请求参数 Param含义Rule是否必须缺省roboti…

[vulnhub] Hackademic.RTB1

第一次打靶机&#xff0c;思路看的红队笔记 https://www.vulnhub.com/entry/hackademic-rtb1,17/ 环境&#xff1a;kali Linux - 192.168.75.131&#xff0c;靶机 - 192.168.75.132 主机发现和端口扫描 扫描整个网络有哪台机子在线&#xff0c;不进行端口扫描 nmap -sP 192.16…

竹云赋能“中国·贵州”全省统一移动应用平台建设,打造政务服务“新引擎”

近日&#xff0c;2024中国国际大数据产业博览会在贵州贵阳圆满落幕。会上&#xff0c;由贵州省政府办公厅牵头建设的“中国贵州”全省统一移动应用平台正式发布&#xff0c;聚焦民生办事、政务公开、政民互动、扁平高效、数据赋能五大模块&#xff0c;旨在打造公平普惠的服务平…

【2020工业图像异常检测文献】PaDiM

PaDiM: a Patch Distribution Modeling Framework for Anomaly Detection and Localization 1、Background 在单类学习&#xff08;仅使用正常数据&#xff08;即“单一类”&#xff09;来训练模型&#xff09;环境中的异常检测和定位任务方法中&#xff0c;要么需要深度神经网…

ubuntu 安装minikube,并拉取k8s镜像

虚拟机是vmware17, 系统是ubuntu20.4&#xff0c; minikube是1.23.1&#xff0c; docker是24.0.7&#xff0c; 为什么要装minikube&#xff0c;通常k8s集群是要3台机子以上&#xff0c;而通过minikube&#xff0c;可以在一台机子上搭建出k8s集群&#xff0c;minikube采用的是D…

【深入学习Redis丨第六篇】Redis哨兵模式与操作详解

〇、前言 哨兵是一个分布式系统&#xff0c;你可以在一个架构中运行多个哨兵进程&#xff0c;这些进程使用流言协议来接收关于Master主服务器是否下线的信息&#xff0c;并使用投票协议来决定是否执行自动故障迁移&#xff0c;以及选择哪个Slave作为新的Master。 文章目录 〇、…