使用API函数复制文件并显示进度的技巧
"使用API函数复制文件并显示进度的方法,适用于NT4.0及以上版本的操作系统。" 在Windows编程中,API(应用程序接口)函数提供了操作系统级别的功能,其中包括文件操作。这里提到的是如何使用API函数`CopyFileEx`来复制文件,并通过自定义的进度回调函数来显示复制进度。`CopyFileEx`是Windows API中的一个高级文件复制函数,它不仅允许复制文件,还可以提供进度信息以及在复制过程中进行更多的控制。 首先,我们看到定义了一些常量,它们在复制文件时有特定用途: - `PROGRESS_CANCEL` (1) 表示用户请求取消操作。 - `PROGRESS_CONTINUE` (0) 指示操作应继续。 - `PROGRESS_QUIET` (3) 表示不要显示任何用户界面。 - `PROGRESS_STOP` (2) 表示用户请求停止操作。 - `COPY_FILE_FAIL_IF_EXISTS` (&H1) 表示如果目标文件已经存在,则复制失败。 - `COPY_FILE_RESTARTABLE` (&H2) 允许在中断后重新启动复制操作。 接下来,声明了`CopyFileEx`函数,它是从`kernel32.dll`库导入的。该函数接收源文件名、目标文件名、进度回调函数指针、用户数据指针、取消标志指针和复制标志作为参数,返回值表示操作是否成功。 在提供的代码中,定义了一个私有的`lngCancel`变量用于存储用户是否请求取消操作的状态,以及`mprgState`和`lblState`对象,用于在进度回调函数中更新进度条状态。 `CopyProgressRoutine`是自定义的进度回调函数,它会根据复制操作的进度调用。参数包括: - `TotalFileSize`:源文件的总大小。 - `TotalBytesTransferred`:已传输的总字节数。 - `StreamSize`:当前流的大小。 - `StreamBytesTransferred`:当前流已传输的字节数。 - `dwStreamNumber`:当前处理的流编号。 - `dwCallbackReason`:回调的原因(如开始、结束、进度更新等)。 - `hSourceFile` 和 `hDestinationFile`:源文件和目标文件的句柄。 - `lpData`:传递给`CopyFileEx`的用户数据。 回调函数中,`mprgState.Value`被用来计算并更新当前的进度百分比,这通常会被用来驱动进度条或其他进度显示控件。 在实际使用中,你需要将这些代码集成到你的程序中,调用`CopyFileEx`函数开始复制操作,并传入你的进度回调函数。这样,在文件复制过程中,用户就可以看到进度并可能选择取消操作。由于`CopyFileEx`不适用于Windows 9x系统,因此在那些系统上需要使用替代方法,例如`CopyFile`函数,但无法获得同样的进度反馈。
apifunctionobjectstringfilec
以前一直以为用API函数只能调用系统的那个复制的对话框来显示进度,原来还有其他方法可以用,不过这个API只能在NT4.0及以上的版本上面才有。
在工程里添加一个模块,将以下代码复制到模块里
Private Const PROGRESS_CANCEL = 1
Private Const PROGRESS_CONTINUE = 0
Private Const PROGRESS_QUIET = 3
Private Const PROGRESS_STOP = 2
Private Const COPY_FILE_FAIL_IF_EXISTS = &H1
Private Const COPY_FILE_RESTARTABLE = &H2
'// 此 API 在 WIN9X 下不能使用
Private Declare Function CopyFileEx Lib "kernel32.dll" Alias "CopyFileExA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal lpProgressRoutine As Long, lpData As Any, ByRef pbCancel As Long, ByVal dwCopyFlags As Long) As Long
Private mlngCancel As Long
Private mprgState As Object
Private mlblState As Object
Public Function CopyProgressRoutine(ByVal TotalFileSize As Currency, _
ByVal TotalBytesTransferred As Currency, _
ByVal StreamSize As Currency, _
ByVal StreamBytesTransferred As Currency, _
ByVal dwStreamNumber As Long, _
ByVal dwCallbackReason As Long, _
ByVal hSourceFile As Long, _
ByVal hDestinationFile As Long, _
ByVal lpData As Long) As Long
'// 显示进度
mprgState.Value = CLng((100 / TotalFileSize) * TotalBytesTransferred)
mlblState.Caption = "已完成: " & FormatPercent(mprgState.Value / 100, 0)
下载后可阅读完整内容,剩余2页未读,立即下载
- 粉丝: 1
- 资源: 17
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C++多态实现机制详解:虚函数与早期绑定
- Java多线程与异常处理详解
- 校园导游系统:无向图实现最短路径探索
- SQL2005彻底删除指南:避免重装失败
- GTD时间管理法:提升效率与组织生活的关键
- Python进制转换全攻略:从10进制到16进制
- 商丘物流业区位优势探究:发展战略与机遇
- C语言实训:简单计算器程序设计
- Oracle SQL命令大全:用户管理、权限操作与查询
- Struts2配置详解与示例
- C#编程规范与最佳实践
- C语言面试常见问题解析
- 超声波测距技术详解:电路与程序设计
- 反激开关电源设计:UC3844与TL431优化稳压
- Cisco路由器配置全攻略
- SQLServer 2005 CTE递归教程:创建员工层级结构