文件拷贝程序

程序类型: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/里面说了这么一句话:

lpNumberOfBytesWritten: 输出参数,指向存储真实写入的数据大小的变量,可能已经到达文件尾等原因,其值可能与nNumberOfBytesToWrite不同。如果lpOverlapped为NULL,则该参数不能为NULL。

这个可能是原作者嵌套一个循环来确保缓冲区中的内容全部写入目标文件的原因吧(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)完成文件拷贝程序(初级版)的更多相关文章

  1. Windows API 函数列表 附帮助手册

    所有Windows API函数列表,为了方便查询,也为了大家查找,所以整理一下贡献出来了. 帮助手册:700多个Windows API的函数手册 免费下载 API之网络函数 API之消息函数 API之 ...

  2. Windows API函数大全(完整)

    Windows API函数大全,从事软件开发的朋友可以参考下 1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一 ...

  3. [windows菜鸟]Windows API函数大全(完整)

    Windows API函数大全,从事软件开发的朋友可以参考下 1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一 ...

  4. C#调用Windows API函数截图

    界面如下: 下面放了一个PictureBox 首先是声明函数: //这里是调用 Windows API函数来进行截图 //首先导入库文件 [System.Runtime.InteropServices ...

  5. VBS调用Windows API函数

    Demon's Blog 忘记了,喜欢一个人的感觉 Demon's Blog  »  程序设计  »  VBS调用Windows API函数 « 用VBS修改Windows用户密码 在VB中创建和使用 ...

  6. Python调用Windows API函数编写录音机和音乐播放器

    功能描述: 1)使用tkinter设计程序界面: 2)调用Windows API函数实现录音机和音乐播放器. . 参考代码: ​ 运行界面: ​

  7. 使用API进行文件读写——CreateFile,ReadFile,WriteFile等

    看了这个帖子:  http://www.vbgood.com/thread-99249-1-1.html  就写了一个使用API读写文件的简单类,苦力活.  演示代码在附件里.  '********* ...

  8. WINDOWS API 函数(超长,值得学习)

    一.隐藏和显示光标 函数: int ShowCursor ( BOOL bShow );  参数 bshow,为布尔型,bShow的值为False时隐藏光标,为True时显示光标:该函数的返回值为整型 ...

  9. Windows API函数大全(精心总结)

    WindowsAPI函数大全(精心总结)    目录 1. API之网络函数... 1 2. API之消息函数... 1 3. API之文件处理函数... 2 4. API之打印函数... 5 5. ...

随机推荐

  1. close和shutdown函数的区别

    close函数首先是将传入的socket句柄引用数减1(因为fork进程时会导致socket句柄被多个进程引用),待到引用数等于0的时候,close才会真正关闭连接. shutdown函数是立刻关闭连 ...

  2. css中postion的fixed与absolute区别详解

    fixed:固定定位,参照位置是浏览器窗口的左上角,即坐标点为(0px, 0px) absolute:绝对定位,参展位置是离当前元素最近的定位方式为fixed,absolute,relative的祖先 ...

  3. RAID设备

    RAID(Redundant Array of Independent Disk),独立冗余磁盘阵列(通常简称磁盘阵列).磁盘阵列的实质是将多个磁盘通过RAID控制器组合在一起,形成一个新的磁盘.这个 ...

  4. QQ上传大文件为什么这么快

    今天和同事在群里讨论“QQ上传大文件/QQ群发送大文件时,可以在极短的时间内完成”是如何做到的. 有时候我们通过QQ上传一个几百M的文件,竟然只用了几秒钟,从带宽上限制可以得出,实际上传文件是不可能的 ...

  5. hql & mysql 札记

    最近在某D实习,刚去就开始各种写HQL,碰壁很多次. 几个知识点记录一下,逐个攻破. sql 中的case when, 选择循环的写法.(http://www.cnblogs.com/zengen/a ...

  6. C#实现万年历(农历、节气、节日、星座、属相、生肖、闰年等)

    C# 万年历 农历 节气 节日 星座 星宿 属相 生肖 闰年月 时辰等,代码如下: using System.Collections.Generic; using System.Text; using ...

  7. BootStrap2学习日记15----选项卡

    导航格式1: <ul class="nav nav-tabs"> <li class="active"><a href=" ...

  8. 2dx关于js响应layer触摸消息的bug

    cocos2dx关于js响应layer触摸消息的bug cocos2d-x 3.7 问题描述: 目前这个版本中(3.7),c++层的layer触摸消息只能通过消息的方式发送给js,不能像lua一样直接 ...

  9. 【阿里云产品公测】阿里云ACE配置全程图解,详细到不行!

    作者:阿里云用户sofia 看过阿里云社区的其他技术大姥们的评测教程,感觉还是不够详细,对于一个第一次接触ace.新浪sae这类的应用来说还是比较陌生的.我最喜欢写教程了,不过我有我的风格,那就是简单 ...

  10. linux服务监控脚本

    配置需要监控的服务器 数组定义:host_ports=(host_name=host_port=uri_path)host_name为容易识别的服务器名称host_port为服务器ip和服务端口uri ...