文档章节

WinAPI: CopyFileEx

涂孟超
 涂孟超
发布于 2014/09/26 15:35
字数 383
阅读 11
收藏 0

function CopyFileEx(
  lpExistingFileName: PWideChar;         { 源文件 }
  lpNewFileName: PWideChar;              { 新的目标文件 }
  lpProgressRoutine: TFNProgressRoutine; { 回调函数; 每复制 64K 调用一次 }
  lpData: Pointer;                       { 给回调函数的参数 }
  pbCancel: PBool;                       { 是个布尔值指针; True 是取消复制 }
  dwCopyFlags: DWORD                     { 复制选项; 下面有补充... }
): BOOL; stdcall;                        { 返回成功或失败 }

//dwCopyFlags(复制选项):
COPY_FILE_FAIL_IF_EXISTS = $00000001; { 如果目标存在则失败返回 }
COPY_FILE_RESTARTABLE    = $00000002; { 若失败则重新开始 }

 
 
 
 
 

 

 

  
//CopyFileEx 使用的回调函数: function ProgressRoutine( TotalFileSize: LARGE_INTEGER; { 文件总字节数 } TotalBytesTransferred: LARGE_INTEGER; { 已复制的字节数 } StreamSize: LARGE_INTEGER; { 当前流的字节数 } StreamBytesTransferred: LARGE_INTEGER; { 当前流已拷贝的字节数 } dwStreamNumber: DWORD; { 当前流序号 } dwCallbackReason: DWORD; { 回调函数的状态; 下面有补充... } hSourceFile: THANDLE; { 源文件句柄 } hDestinationFile: THANDLE; { 目标文件句柄 } lpData: Pointer { CopyFileEx 传递的参数指针 } ): DWORD; stdcall; { 返回值; 下面有补充... } //dwCallbackReason(回调函数的状态): CALLBACK_CHUNK_FINISHED = $00000000; { 复制进行中 } CALLBACK_STREAM_SWITCH = $00000001; { 准备开始} //回调函数可以使用的返回值: PROGRESS_CONTINUE = 0; { 继续 } PROGRESS_CANCEL = 1; { 取消 } PROGRESS_STOP = 2; { 暂停 } PROGRESS_QUIET = 3; { 终止回调, 但不停止复制 }

一个实现复制进度的测试, 测试前在窗体上放个 TProgressBar:

//回调函数; 为了运算我把其中的 LARGE_INTEGER 类型改成 Int64 了
function ProgressRoutine(TotalFileSize, TotalBytesTransferred, StreamSize,
  StreamBytesTransferred: Int64; dwStreamNumber, dwCallbackReason: DWORD;
  hSourceFile, hDestinationFile: THANDLE; lpData: Pointer): DWORD; stdcall;
begin
  Form1.ProgressBar1.Position := Trunc(TotalBytesTransferred / TotalFileSize * 100);
  Application.ProcessMessages;
  Result := PROGRESS_CONTINUE;
end;

//复制
procedure TForm1.Button1Click(Sender: TObject);
const
  s = 'C:\Temp\Test.rar';
  d = 'C:\Temp\NewDir\Test.rar';
begin
  Assert(FileExists(s), '源文件不存在');
  Assert(DirectoryExists(ExtractFilePath(d)), '目标路径不存在');
  CopyFileEx(PChar(s), PChar(d), @ProgressRoutine, nil, nil, COPY_FILE_RESTARTABLE);
end;

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2010/01/08/1642632.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
如何模拟输入用户名、密码来访问网络邻居

如何模拟输入用户名、密码来访问网络邻居 基本原理 在Windows 环境下,应用程序使用Windows 网络函数(WNet)来实现网络功能 而不用关心网络的供应商及具体实现,因为WNet 函数是独立于网络的...

vga
2014/03/04
0
0
Go语言Windows程序设计(1)--简单弹出消息窗口

这几天公司比较空,又开始玩Go语言,发现它可以通过一个https://github.com/lxn/go-winapi go-winapi的库写windows程序,于是就开始玩了,当然,也已经有了很多基于它而进一步封装便于开发的...

卧雪Sirk
2016/03/19
39
0
如何调用WINAPI声明的动态库?

一个库的函数以 WINAPI声明 然后调的时侯就有问题 以WINAPI声明的函数 比如 long dlltest(); 就会变成long _dlltest@0() 试着用 typef long (stdcall *_pdlltest)(); 这样去导 结果导不出来 ...

我是你
2014/04/29
87
0
这段代码为什么会崩啊

CCriticalSection atrtest; list list2; void deleteList(); //线程1的入口函数 DWORD WINAPI Fun1Proc(LPVOID lpParameter)//thread data { while(TRUE) { deleteList(); } return 0; } //线......

智勇
2014/05/22
214
3
PNotes 这软件不错

这软件是纯C的WINAPI写的 支持换肤等功能 学习WINAPI的,可以好好研究一下源代码

fdasljlf
2011/04/24
1K
20

没有更多内容

加载失败,请刷新页面

加载更多

Kali Linux Docker 練習

docker pull kalilinux/kali-linux-docker docker run -t -i kalilinux/kali-linux-docker /bin/bash apt-get update apt-get install htop apt-get install nmap apt-get install wpscan ap......

BaiyuanLab
今天
1
0
通俗大白话来理解TCP协议的三次握手和四次分手

最近在恶补计算机网络方面的知识,之前对于TCP的三次握手和四次分手也是模模糊糊,对于其中的细节更是浑然不知,最近看了很多这方面的知识,也在系统的学习计算机网络,加深自己的CS功底,就...

onedotdot
今天
2
0
TiDB 在爱奇艺的应用及实践

爱奇艺,中国高品质视频娱乐服务提供者,2010 年 4 月 22 日正式上线,推崇品质、青春、时尚的品牌内涵如今已深入人心,网罗了全球广大的年轻用户群体,积极推动产品、技术、内容、营销等全方...

TiDB
今天
1
0
Web系统大规模并发:电商秒杀与抢购

一、大规模并发带来的挑战 在过去的工作中,我曾经面对过5w每秒的高并发秒杀功能,在这个过程中,整个Web系统遇到了很多的问题和挑战。如果Web系统不做针对性的优化,会轻而易举地陷入到异常...

xtof
今天
3
0
代码质量管理平台-sonarqube

在工作中,往往开发的时候会不怎么注重代码质量的人很多,存在着很多的漏洞和隐患等问题,sonarqube可以进行代码质量的审核,而且十分的残酷。。。。。接下来我们说下怎么安装 进入官网下载:...

落叶清风
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部