文档章节

WinAPI: CopyFileEx

涂孟超
 涂孟超
发布于 2014/09/26 15:35
字数 383
阅读 33
收藏 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;

 
 
 
 
 

 

 

  
涂孟超
粉丝 13
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
加载中
请先登录后再评论。
C/C++中Windows API 简单的(Callback)回调机制

首先来说说什么是调用和回调 当一个程序调用windows API时的过程称为Call 当windows API调用程序里面的函数时这称之为Callback 下面举一个简单的例子来说明回调的用途 编写一个程序实现把res...

抖音hzcya
06/25
0
0
黑客常用WinAPI函数整理

之前的博客写了很多关于Windows编程的内容,在Windows环境下的黑客必须熟练掌握底层API编程。为了使读者对黑客常用的Windows API有个更全面的了解以及方便日后使用API方法的查询,特将这些常...

osc_77ruf91k
2018/03/09
1
0
如何模拟输入用户名、密码来访问网络邻居

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

vga
2014/03/04
161
0
博客总目录(2007.11.12 - 2010.4.25)

如果我的学习记录和历程能对你有所帮助, 我非常高兴; 但是 -- "万一" 不是高手、更不是大师, 只是利用工作之余学点东西, 并感觉学得挺吃力. 内容都是写时才会, 难免稚嫩, 所以 "仅供参考" 可...

涂孟超
2014/09/26
49
0
Windows多线程开发

1、多线程测试实例:   此时在多核CPU下,主线程和子线程可同时运行;时间片是怎么分配的呢?感觉好乱呢? #include <windows.h> include <iostream> include <stdlib.h> using namespace...

花花大千世界
2019/06/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

程序员必备之终端模拟器,让你的终端世界多一抹“颜色”

作者:HelloGitHub-ChungZH 当你逐渐厌倦了 cmd 的枯燥黑屏、powershell 的单调蓝底,可以来尝试一下使用可定制性更高的终端模拟器。下面是 HelloGitHub 从 GitHub 上收集的一些开源终端模拟...

osc_rbml5ydi
42分钟前
9
0
饿了么交易系统 5 年演化史

Photo @ Bluehouse Skis 文 | 挽晴 个人简介: 2014年12月加入饿了么,当时参与后台系统的研发(Walis+Javis=>Walle),主要面向客服和BD。 2015年5月开始接触订单系统的研发,7月负责订单研发组...

osc_lhmderwy
43分钟前
9
0
pip安装第三方库,加入清华镜像源的方法

pip install 库名称 -i https://pypi.tuna.tsinghua.edu.cn/simple some-package

云烟成雨forever
44分钟前
18
0
三.Activity启动流程-AMS请求Zygote启动进程过程

。。。。

osc_116hbwph
45分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部