用Windows API函数(CreateFile/ReadFile/WriteFile/CloseHandle)完成文件拷贝程序(初级版)
文件拷贝程序
程序类型:Console
参数:源文件名 目的文件名
要求:1.只能使用Windows API函数(CreateFile/ReadFile/WriteFile/CloseHandle)完成
这个程序是借鉴网上的一位程序员的,根据我自己的需要进行了修改,但是网址我找不到了,现向他致敬。我修改后的代码如下(代码1):
#include<stdio.h>
#include<windows.h>
#include "iostream"
//#include "DLLShiXian"
using namespace std;
void copyfuc(char *Sourcefile,char *Destinationfile)
{
HANDLE hSourceFile = CreateFile(Sourcefile, GENERIC_READ, , NULL, OPEN_ALWAYS, , NULL);
HANDLE hDestFile = CreateFile(Destinationfile, GENERIC_WRITE, , NULL, CREATE_ALWAYS, , NULL);
if( hSourceFile == INVALID_HANDLE_VALUE || hDestFile == INVALID_HANDLE_VALUE)
{
cout<<"无法复制文件!"<<endl;
return;
}
DWORD dwRemainSize=GetFileSize(hSourceFile,NULL);
];
)
{
DWORD dwActualRead=;
ReadFile(hSourceFile,buffer,,&dwActualRead,NULL);
dwRemainSize-=dwActualRead;
DWORD dwActualWrote=;
while(dwActualWrote<dwActualRead)
{
DWORD dwOnceWrote = ;
WriteFile(hDestFile,buffer+dwActualWrote,dwActualRead-dwActualWrote,&dwOnceWrote,NULL);
dwActualWrote+=dwOnceWrote;
}
}
CloseHandle(hSourceFile);
CloseHandle(hDestFile);
}
void main()
{
];
cout<<"请输入源文件的路径及文件名"<<endl;
cin>>Sourcefile;
];
cout<<"请输入目标文件的路径及文件名"<<endl;
cin>>Destinationfile;
copyfuc(Sourcefile,Destinationfile);
}
然后自我感觉Writefile函数中无需考虑lpNumberOfBytesWritten和nNumberOfBytesToWrite是否相等的问题,便把代码简化了一下,复制文件时没有产生错误,如下(代码2):
#include<windows.h>
#include "iostream"
using namespace std;
void copyfuc(char *Sourcefile,char *Destinationfile)//定义一个子程序,参数分别是源文件名和目标文件名
{
HANDLE hSourceFile=CreateFile(Sourcefile, GENERIC_READ, , NULL, OPEN_ALWAYS, , NULL);//用createfile创建或者打开源文件
HANDLE hDestFile=CreateFile(Destinationfile, GENERIC_WRITE, , NULL, CREATE_ALWAYS, , NULL);//用createfile创建或者打开目标文件
if( hSourceFile==INVALID_HANDLE_VALUE||hDestFile==INVALID_HANDLE_VALUE)//打开或者创建文件失败,则返回错误信息
{
cout<<"无法复制文件!"<<endl;
return;
}
DWORD dwRemainSize=GetFileSize(hSourceFile,NULL);//获取源文件大小
];//设置缓冲区
)//复制文件,每次最多复制1024个字节
{
DWORD dwActualRead=;//实际读取字节数,也就是缓冲区中文件大小
ReadFile(hSourceFile,buffer,,&dwActualRead,NULL);//读取源文件到缓冲区
dwRemainSize-=dwActualRead;//剩余文件大小
DWORD dwActualWrote=;//使用结束后清0,等待存储下一次读取的字节数
DWORD dwOnceWrote=;//用来保存实际写入字节数
WriteFile(hDestFile,buffer,dwActualRead,&dwOnceWrote,NULL);//把缓冲区内容写入目标文件
}
CloseHandle(hSourceFile);
CloseHandle(hDestFile);
}
void main()
{
];
cout<<"请输入源文件的路径及文件名"<<endl;
cin>>Sourcefile;
];
cout<<"请输入目标文件的路径及文件名"<<endl;
cin>>Destinationfile;
copyfuc(Sourcefile,Destinationfile);
return;
}
但是我在深入学习他的过程中找到一篇文章http://a547705232.blog.163.com/blog/static/1724915952010102644045562/里面说了这么一句话:
这个可能是原作者嵌套一个循环来确保缓冲区中的内容全部写入目标文件的原因吧(24-29行),我又查看了其他的文档和资料,也看了MSDN,没有发现同样的描述,假如以后知道了再贴上来。
感觉这个程序还是不全面,以后再完善,比如加上一个对话框来选择源文件,一个对话框来选择目标文件,假如目标文件不存在可以新建,若文件很大,添加文件复制进度条等等功能。
关于createfile的具体用法请戳这儿:http://www.cppblog.com/yishanhante/articles/19545.html,http://blog.csdn.net/mafuli007/article/details/7370279
另推荐一个BLOG,里面有很多Windows API编程实例,可以看一下:http://blog.csdn.net/caimouse/article/details/11815095
当然你也可以查看MSDN(英文):http://msdn.microsoft.com/en-us/library/aa365747(VS.85).aspx和
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365467(v=vs.85).aspx
用Windows API函数(CreateFile/ReadFile/WriteFile/CloseHandle)完成文件拷贝程序(初级版)的更多相关文章
- Windows API 函数列表 附帮助手册
所有Windows API函数列表,为了方便查询,也为了大家查找,所以整理一下贡献出来了. 帮助手册:700多个Windows API的函数手册 免费下载 API之网络函数 API之消息函数 API之 ...
- Windows API函数大全(完整)
Windows API函数大全,从事软件开发的朋友可以参考下 1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一 ...
- [windows菜鸟]Windows API函数大全(完整)
Windows API函数大全,从事软件开发的朋友可以参考下 1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一 ...
- C#调用Windows API函数截图
界面如下: 下面放了一个PictureBox 首先是声明函数: //这里是调用 Windows API函数来进行截图 //首先导入库文件 [System.Runtime.InteropServices ...
- VBS调用Windows API函数
Demon's Blog 忘记了,喜欢一个人的感觉 Demon's Blog » 程序设计 » VBS调用Windows API函数 « 用VBS修改Windows用户密码 在VB中创建和使用 ...
- Python调用Windows API函数编写录音机和音乐播放器
功能描述: 1)使用tkinter设计程序界面: 2)调用Windows API函数实现录音机和音乐播放器. . 参考代码: 运行界面:
- 使用API进行文件读写——CreateFile,ReadFile,WriteFile等
看了这个帖子: http://www.vbgood.com/thread-99249-1-1.html 就写了一个使用API读写文件的简单类,苦力活. 演示代码在附件里. '********* ...
- WINDOWS API 函数(超长,值得学习)
一.隐藏和显示光标 函数: int ShowCursor ( BOOL bShow ); 参数 bshow,为布尔型,bShow的值为False时隐藏光标,为True时显示光标:该函数的返回值为整型 ...
- Windows API函数大全(精心总结)
WindowsAPI函数大全(精心总结) 目录 1. API之网络函数... 1 2. API之消息函数... 1 3. API之文件处理函数... 2 4. API之打印函数... 5 5. ...
随机推荐
- js获取非行间样式/定义样式
<!--DOCTYPE html--> <html> <head> <meta charset="utf-8" /> <sty ...
- 关于apache的重启
一:Apache重起的最好方法apachectl graceful http://blog.csdn.net/qianling3439/article/details/8622618 二:请问apac ...
- 分布式缓存技术redis学习(三)——redis高级应用(主从、事务与锁、持久化)
上文<详细讲解redis数据结构(内存模型)以及常用命令>介绍了redis的数据类型以及常用命令,本文我们来学习下redis的一些高级特性.目录如下: 安全性设置 设置客户端操作秘密 客户 ...
- python 接口测试 、提交数据
在测试过程中经常会遇见需要向服务器提交数据.或者进行接口测试,这个有很多方法,但是我经常用的就是使用python 编写脚本提交,方便.说说方法: 思路: 1.首先有一个提交数据的url 2.按照字典的 ...
- Java协变返回类型
今天看到句话:“支持重写方法时返回协变类型”. 那么什么事协变类型?在网上找了找资料,大体上明白了. Java 5.0添加了对协变返回类型的支持,即子类覆盖(即重写)基类方法时,返回的类型可以是基类方 ...
- iOS 全局竖屏 单个viewcontroller点击按钮支持横屏
问题描述:项目工程只支持竖屏,在播放器页面需要点击按钮进行横竖屏切换,并能根据手机的方向进行自动旋转 如图:只勾选了竖屏 解决方法:(主要是采用视图transform的原理 横屏时调整视频视图上的每个 ...
- ubuntu 换源
经过自己一番折腾后,发现用这个方法换源最简单.直接. sudo vi /etc/apt/sources.list 把sources.list里面的内容全部替换为一下内容 deb http://mirr ...
- JS 鼠标事件大全
一般事件 事件 浏览器支持 描述 onClick HTML: 2 | 3 | 3.2 | 4 Browser: IE3 | N2 | O3 鼠标点击事件,多用在某个对象控制的范围内的鼠标点击 onDb ...
- MySQL中/*!40100注释
MySQL中的注释 MySQL中的注释有三种: # 注释内容 -- 注释内容 /* 注释内容*/ 但是,在导出的SQL文件中,也会看到类似如下内容的注释: CREATE DATABASE `blog` ...
- [转]在PHP语言中使用JSON
本文转自:http://www.ruanyifeng.com/blog/2011/01/json_in_php.html 作者: 阮一峰 日期: 2011年1月14日 目前,JSON已经成为最流行的数 ...