织梦CMS - 轻松建站从此开始!

罗索

当前位置: 主页>杂项技术>VC(MFC)>

CopyFileEx 函数的简单用法

罗索客 发布于 2009-11-10 09:17 点击:次 
复制文件可以用 CopyFile API 函数。CopyFileEx 函数的好处是:它提供了回调函数,程序员可以向用户显示复制的过程。
TAG:

复制文件可以用 CopyFile API 函数。CopyFileEx 函数的好处是:它提供了回调函数,程序员可以向用户显示复制的过程。

这里我不打算介绍回调函数的详细参数,这个可以看MSDN;我说一些MSDN中没有说明的东西。

1、多久回调一次?答案是:每传输 64KB 数据回调一次;
2、回调原因第一次返回:CALLBACK_STREAM_SWITCH ,以后都返回:CALLBACK_CHUNK_FINISHED

第一次表示开始复制,但还没有复制。

3、回调函数返回 PROGRESS_CONTINUE,表示继续复制文件;返回 PROGRESS_CANCEL,表示中断复制,这个比较有用。

上边都是理论,下面我们看一个例子,该例子为 VC++ 6.0 控制台工程。建立一个控制台工程,选择一个空的工程,建立一个 C++ 文件,把下面代码复制进去即可。

  1. /**//*************************************************************/ 
  2. //  
  3. //    CopyFileEx 回调函数应用  
  4. //  
  5. //    至尊宝宝    zaodt_ms@hotmail.com  
  6. //  
  7. //    2007-11-21  
  8. //  
  9. /**//*************************************************************/ 
  10.  
  11. #define        _WIN32_WINNT    0x0500            // 不加这个不同通过编译  
  12.  
  13. #include <windows.h>  
  14. #include <stdio.h>  
  15.  
  16. DWORD CALLBACK CopyProgress(  
  17.     LARGE_INTEGER TotalFileSize,            // total file size, in bytes  
  18.     LARGE_INTEGER TotalBytesTransferred,    // total number of bytes transferred  
  19.     LARGE_INTEGER StreamSize,                // total number of bytes for this stream  
  20.     LARGE_INTEGER StreamBytesTransferred,    // total number of bytes transferred for this stream  
  21.     DWORD dwStreamNumber,                    // the current stream  
  22.     DWORD dwCallbackReason,                    // reason for callback  
  23.     HANDLE hSourceFile,                        // handle to the source file  
  24.     HANDLE hDestinationFile,                // handle to the destination file  
  25.     LPVOID lpData                            // passed by CopyFileEx  
  26. )  
  27. ...{  
  28.     static int nRecord = 0;  
  29.     nRecord++;  
  30.     printf("回调次数:%d    已传输:%08X:%08X    文件大小:%08X:%08X ",  
  31.         nRecord,  
  32.         TotalBytesTransferred.HighPart,  
  33.         TotalBytesTransferred.LowPart,  
  34.         TotalFileSize.HighPart,  
  35.         TotalFileSize.LowPart);  
  36.  
  37.     return PROGRESS_CONTINUE;  
  38. }  
  39.  
  40.  
  41. int main(int argc, char* argv[])  
  42. ...{  
  43.     if(argc!=3)  
  44.     ...{  
  45.         printf("用法:命令 源文件 目标文件");  
  46.         return 0;  
  47.     }  
  48.  
  49.     if(!CopyFileEx(argv[1],argv[2],(LPPROGRESS_ROUTINE)CopyProgress,NULL,FALSE,COPY_FILE_FAIL_IF_EXISTS))  
  50.     ...{  
  51.         printf("CopyFileEx() failed.");  
  52.         return 0;  
  53.     }  
  54.  
  55.     return 0;  
  56. }  
  57.  

运行结果:
回调次数:1    已传输:00000000:00000000    文件大小:00000000:00F60964
回调次数:2    已传输:00000000:00010000    文件大小:00000000:00F60964
回调次数:3    已传输:00000000:00020000    文件大小:00000000:00F60964
回调次数:4    已传输:00000000:00030000    文件大小:00000000:00F60964
回调次数:5    已传输:00000000:00040000    文件大小:00000000:00F60964
回调次数:6    已传输:00000000:00050000    文件大小:00000000:00F60964
回调次数:7    已传输:00000000:00060000    文件大小:00000000:00F60964

分析:

大家看第一次,已传输为0,从第二次开始,每次传输为 0x10000,为 64KB 字节。

如果您通过这篇文章明白了 CopyFileEx 的回调用法,请回帖,以资鼓励!

(至尊宝宝)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/200911/7617.html]
本文出处:网络博客 作者:至尊宝宝
顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容