[WinAPI] API 9 [文件的删除、复制和移动功能]

简介:


 

 

Windows系统为文件的删除、复制、重命名或移动文件提供了相应的API函数。删除文件使用DeleteFile函数;复制文件使用CopyFile函数;重命名文件和移动文件实际是一个操作,使用MoveFile函数。这几个函数的使用都非常简单,下面分别介绍。


(1) DeleteFile。
DeleteFile的功能是删除文件。以文件路径作为输入,指向需要删除的文件。文件路径可以是类似于“c:\files\delete.txt”的绝对路径,也可以是类似于“.\delete.txt”的相对路径,二相对于可执行文件所在的路径。
◇参数
lpFileName:输入参数,所要删除的文件的相对路径或绝对路径。
◇返回值
返回BOOL值,表示文件删除是否成功。
◇使用说明
如果程序返回失败,可以使用GetLastError函数获取错误信息。

 

(2) CopyFile。
CopyFile的功能是复制文件。通过参数输入复制文件和源路径和目的路径,路径可以是绝对路径也可以是相对路径,还可以通过参数指明如果目的路径已经存在文件,是否覆盖。可以使用CopyFileEx函数进行更为高级的操作,比如在复制进行过程中取消复制等。CopyFileEx可以指定
一个回调函数来处理文件复制中所可能发生的各种情况。
◇参数
lpExistingFileName:输入参数,已经存在的所需复制文件的源路径。
lpNewFileName:输入参数,新文件路径,复制文件的目的路径。
bFailIfExists:输入参数,指明如果在目的路径存在文件时是否覆

将不覆盖已经存在的文件,如果存在,则返回失败。这时使用GetLastError获取错误代码,将返回80(Ox50)。
◇返回值
返回BOOL值,表示文件复制是否成功。
◇使用说明
如果程序返回失败,可以使用GetLastError函数获取错误信息。


(3) MoveFile。
MoveFile的功能是移动、重命名文件和目录。通过参数输入源路径和目的路径,路径可以是绝对路径也可以是相对路径,如果目的路径的文件或目录已经存在,则返回失败。可以使用MoveFileEx函数来指定更多的选项,如果已经存在是否替换等。还可以使用MoveFileWithProgress指定一个回调函数来处理文件移动中所可能发生的各种情况。

◇参数
lpExistingFileName:输入参数,为已经存在的所需移动文件的源路径。
lpNewFileName:输入参数,新文件路径,移动文件的目的路径。
◇返回值
返回BOOL值,表示文件移动是否成功。
◇使用说明
如果程序返回失败,可以使用GetLastError函数获取错误信息。


(4) CopyFileEx、MoveFileEx以及MoveFileWithProgreSS.
这3个API函数功能更丰富,不再做详细介绍.

 

本实例使用DeleteFile、CopyFile、MoveFile来完成文件的删除、复制和移动功能。编译生成可执行文件,通过参数来指定程序完成的功能。-d参数表示删除文件,后面跟所需删除的文件路径;-m参数表示移动、重命名文件,之后的参数分别是源路径和目的路径;-c参数表示复制文件,之后跟源路径和目的路径。在复制文件过程中,如果文件已经存在,会提醒用户是否覆盖。

 

 

复制代码
  1 /* ************************************
  2 *《精通Windows API》 
  3 * 示例代码
  4 * wr.c
  5 * 4.3.2    创建、打开、读写文件,获取文件大小
  6 **************************************/
  7 
  8 /* 头文件 */
  9 #include <windows.h>
 10 #include <stdio.h>
 11 
 12 /* ************************************
 13 * DWORD ReadFileContent(LPSTR szFilePath)
 14 * 功能    获取文件大小
 15 *        读取文件内容,并以16进制的形式打印出来
 16 * 参数    LPSTR szFilePath
 17 *        文件路径
 18 **************************************/
 19 DWORD ReadFileContent(LPSTR szFilePath)
 20 {
 21     //文件大小
 22     HANDLE hFileRead;
 23     //保存文件大小
 24     LARGE_INTEGER liFileSize;
 25     //成功读取的文件数据大小
 26     DWORD dwReadedSize;
 27     //累加计算已经读取数据的大小
 28     LONGLONG liTotalRead = 0;
 29     //文件数据缓存
 30     BYTE lpFileDataBuffer[32];
 31 
 32     //打开已经存在的文件,读取内容。    
 33     hFileRead = CreateFileA(szFilePath,// 要打开的文件名
 34         GENERIC_READ,               // 以读方式打开
 35         FILE_SHARE_READ,           // 可共享读
 36         NULL,                      // 默认安全设置
 37         OPEN_EXISTING,             // 只打开已经存在的文件
 38         FILE_ATTRIBUTE_NORMAL,     // 常规文件属性
 39         NULL);                     // 无模板
 40 
 41     //打开文件是否成功。
 42     if(hFileRead==INVALID_HANDLE_VALUE)
 43     {
 44         printf("打开文件失败:%d",GetLastError());
 45     }
 46 
 47     if(!GetFileSizeEx(hFileRead,&liFileSize))
 48     {
 49         printf("获取文件大小失败:%d",GetLastError());
 50     }
 51     else
 52     {
 53         printf("文件大小为:%d/n",liFileSize.QuadPart);
 54     }
 55 
 56     //循环读取并打印文件内容
 57     while(TRUE)
 58     {
 59         DWORD i;
 60 
 61         if(!ReadFile(hFileRead,    //读文件的句柄
 62             lpFileDataBuffer,    //存储读取的文件内容
 63             32,                    //读的大小(字节)
 64             &dwReadedSize,        //实际读取的大小
 65             NULL))                //不使用Overlapped
 66         {
 67             printf("读文件错误:%d/n",GetLastError());
 68             break;
 69         }
 70         printf("读取了%d字节,文件内容是:",dwReadedSize);
 71         
 72         for(i=0; i<dwReadedSize; i++)
 73         {
 74             printf("0x%x ",lpFileDataBuffer[i]);
 75         }
 76         printf("/n");
 77         liTotalRead += dwReadedSize;
 78         if(liTotalRead == liFileSize.QuadPart)
 79         {
 80             printf("读文件结束/n");
 81             break;
 82         }
 83     }
 84     CloseHandle(hFileRead);
 85     return 0;
 86 }
 87 
 88 /* ************************************
 89 *  SaveDataToFile
 90 * 功能    将数据存储到文件末尾
 91 * 参数    LPSTR szFilePath    文件路径
 92 *        LPVOID lpData        需存储的数据
 93 *        DWORD dwDataSize    数据大小(字节)
 94 **************************************/
 95 DWORD SaveDataToFile(
 96                      LPSTR szFilePath,
 97                      LPVOID lpData,
 98                      DWORD dwDataSize)
 99 {
100     //文件句柄
101     HANDLE hFileWrite;
102     //成功写入的数据大小
103     DWORD dwWritedDateSize;
104 
105     //打开已经存在的文件,读取内容。    
106     hFileWrite = CreateFileA(szFilePath,    // 要打开的文件名
107         GENERIC_WRITE,            // 以写方式打开
108         0,                        // 可共享读
109         NULL,                    // 默认安全设置
110         OPEN_ALWAYS,            // 打开已经存在的文件,没用则创建
111         FILE_ATTRIBUTE_NORMAL,    // 常规文件属性
112         NULL);                    // 无模板
113     
114     //判断是否打开成功
115     if(hFileWrite==INVALID_HANDLE_VALUE)
116     {
117         printf("打开文件失败:%d/n",GetLastError());
118     }
119 
120     //设置文件指针到文件尾
121     SetFilePointer(hFileWrite,0,0,FILE_END);
122 
123     //将数据写入文件
124     if(!WriteFile(hFileWrite,lpData,dwDataSize,&dwWritedDateSize,NULL))
125     {
126         printf("写文件失败:%d/n",GetLastError());
127     }
128     else
129     {
130         printf("写文件成功,写入%d字节。/n",dwWritedDateSize);
131     }
132     CloseHandle(hFileWrite);
133     return 0;
134 }
135 
136 /* ************************************
137 * int main(void)
138 * 功能    演示使用SaveDataToFile和ReadFileContent函数
139 **************************************/
140 int main(void)
141 {
142     LPSTR szFileData = "这是一个例子";
143     SaveDataToFile("C://show.txt",szFileData,lstrlenA(szFileData));
144     ReadFileContent("C://show.txt");
145     return 0;
146 }
复制代码
相关文章
|
16天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
45 2
|
2月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
48 4
|
2月前
|
机器学习/深度学习 算法 Java
通过 Java Vector API 利用 SIMD 的强大功能
通过 Java Vector API 利用 SIMD 的强大功能
47 10
|
2月前
|
移动开发 前端开发 JavaScript
前端开发实战:利用Web Speech API之speechSynthesis实现文字转语音功能
前端开发实战:利用Web Speech API之speechSynthesis实现文字转语音功能
189 0
|
3月前
|
Java API 开发者
【Java字节码操控新篇章】JDK 22类文件API预览:解锁Java底层的无限可能!
【9月更文挑战第6天】JDK 22的类文件API为Java开发者们打开了一扇通往Java底层世界的大门。通过这个API,我们可以更加深入地理解Java程序的工作原理,实现更加灵活和强大的功能。虽然目前它还处于预览版阶段,但我们已经可以预见其在未来Java开发中的重要地位。让我们共同期待Java字节码操控新篇章的到来!
|
3月前
|
Java API 开发者
【Java字节码的掌控者】JDK 22类文件API:解锁Java深层次的奥秘,赋能开发者无限可能!
【9月更文挑战第8天】JDK 22类文件API的引入,为Java开发者们打开了一扇通往Java字节码操控新世界的大门。通过这个API,我们可以更加深入地理解Java程序的底层行为,实现更加高效、可靠和创新的Java应用。虽然目前它还处于预览版阶段,但我们已经可以预见其在未来Java开发中的重要地位。让我们共同期待Java字节码操控新篇章的到来,并积极探索类文件API带来的无限可能!
|
3月前
|
JSON 搜索推荐 API
深入了解亚马逊商品详情API:功能、作用与实例
亚马逊商品详情API接口由官方提供,允许开发者通过程序调用获取商品详细信息,如标题、价格等,适用于电商数据分析、搜索及个性化推荐等场景。接口名称包括ItemLookup、GetMatchingProductForId等,支持HTTP POST/GET请求,需提供商品ID、API密钥及其他可选参数。返回数据格式通常为JSON或XML,涵盖商品详情、分类、品牌、价格、图片URL及用户评价等。该接口对数据收集、实时推荐、营销活动及数据分析至关重要,有助于提升电商平台的数据处理能力、用户体验及商家运营效率。使用时需注册亚马逊开发者账号并申请API访问权限,获取API密钥后按文档构建请求并处理响应数据。
|
4月前
|
存储 JavaScript 前端开发
探索React状态管理:Redux的严格与功能、MobX的简洁与直观、Context API的原生与易用——详细对比及应用案例分析
【8月更文挑战第31天】在React开发中,状态管理对于构建大型应用至关重要。本文将探讨三种主流状态管理方案:Redux、MobX和Context API。Redux采用单一存储模型,提供预测性状态更新;MobX利用装饰器语法,使状态修改更直观;Context API则允许跨组件状态共享,无需第三方库。每种方案各具特色,适用于不同场景,选择合适的工具能让React应用更加高效有序。
88 0
|
4月前
|
JavaScript 网络协议 API
【Azure API 管理】Azure APIM服务集成在内部虚拟网络后,在内部环境中打开APIM门户使用APIs中的TEST功能失败
【Azure API 管理】Azure APIM服务集成在内部虚拟网络后,在内部环境中打开APIM门户使用APIs中的TEST功能失败
|
4月前
|
监控 Cloud Native 容灾
核心系统转型问题之API网关在云原生分布式核心系统中的功能如何解决
核心系统转型问题之API网关在云原生分布式核心系统中的功能如何解决