ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 366|回复: 0

API函数CopyFileEx -- 复制大文件带进度显示的代码

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-6-15 12:15 | 显示全部楼层 |阅读模式
本帖最后由 Cavan2022 于 2023-6-15 13:09 编辑

以下代码在VS上可以运行,哪位老师可以改成Excel上运行VBA代码,谢谢!

  1. Imports System.Runtime.InteropServices

  2. Public Class Form1
  3.     Private pbCancel As Int32

  4.     <DllImport("kernel32.dll", CharSet:=CharSet.Auto)> _
  5.     Private Shared Function CopyFileEx( _
  6.         ByVal lpExistingFileName As String, _
  7.         ByVal lpNewFileName As String, _
  8.         ByVal lpProgressRoutine As CopyProgressRoutine, _
  9.         ByVal lpData As IntPtr, _
  10.         ByRef pbCancel As Int32, _
  11.         ByVal dwCopyFlags As ECopyFileFlags) As Boolean
  12.     End Function

  13.     ''' <summary>
  14.     ''' 執行 CopyFileEx 方法的回呼函式定義。
  15.     ''' </summary>
  16.     Delegate Function CopyProgressRoutine( _
  17.         ByVal TotalFileSize As Long, _
  18.         ByVal TotalBytesTransferred As Long, _
  19.         ByVal StreamSize As Long, _
  20.         ByVal StreamBytesTransferred As Long, _
  21.         ByVal dwStreamNumber As UInteger, _
  22.         ByVal dwCallbackReason As ECopyProgressCallbackReason, _
  23.         ByVal hSourceFile As IntPtr, _
  24.         ByVal hDestinationFile As IntPtr, _
  25.         ByVal lpData As IntPtr) As ECopyProgressResult

  26.     ''' <summary>
  27.     ''' 執行 CopyFileEx 的回呼函式的回傳列舉。
  28.     ''' </summary>
  29.     Enum ECopyProgressResult As UInteger
  30.         PROGRESS_CONTINUE = 0
  31.         PROGRESS_CANCEL = 1
  32.         PROGRESS_STOP = 2
  33.         PROGRESS_QUIET = 3
  34.     End Enum

  35.     Enum ECopyProgressCallbackReason As UInteger
  36.         CALLBACK_CHUNK_FINISHED = 0
  37.         CALLBACK_STREAM_SWITCH = 1
  38.     End Enum

  39.     <Flags()> _
  40.     Enum ECopyFileFlags As UInteger
  41.         COPY_FILE_FAIL_IF_EXISTS = 1
  42.         COPY_FILE_RESTARTABLE = 2
  43.         COPY_FILE_OPEN_SOURCE_FOR_WRITE = 4
  44.         COPY_FILE_ALLOW_DECRYPTED_DESTINATION = 8
  45.     End Enum

  46.     Private Function XCopy(ByVal oldFile As String, ByVal newFile As String) As Boolean
  47.         Return CopyFileEx(oldFile, newFile, New CopyProgressRoutine(AddressOf Me.CopyProgressHandler), IntPtr.Zero, pbCancel, ECopyFileFlags.COPY_FILE_RESTARTABLE)
  48.     End Function

  49.     Private Function CopyProgressHandler(ByVal total As Long, ByVal transferred As Long, ByVal streamSize As Long, ByVal StreamByteTrans As Long, ByVal dwStreamNumber As UInteger, ByVal reason As ECopyProgressCallbackReason, _
  50.      ByVal hSourceFile As IntPtr, ByVal hDestinationFile As IntPtr, ByVal lpData As IntPtr) As ECopyProgressResult
  51.         Label1.Text = String.Format("进度: {0}%", CInt(transferred / total * 100))
  52.         Application.DoEvents()

  53.         Return ECopyProgressResult.PROGRESS_CONTINUE
  54.     End Function

  55.     Private Sub btnCopy_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCopy.Click
  56.         If XCopy("C:\Source.avi", "D:\New.avi") Then
  57.             MsgBox("复制成功")
  58.         Else
  59.             MsgBox("复制失败")
  60.         End If

  61.     End Sub

  62.     Private Sub btnCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancel.Click
  63.         pbCancel = 1
  64.         Application.DoEvents()
  65.     End Sub
  66. End Class
复制代码

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-16 13:38 , Processed in 0.027467 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表