zcbenz 发表于 2009-1-26 21:02:21

带进度的文件复制(不使用额外进程)

记得坛子里有人发过类似的东西,是通过命令行命令实现的,但那样需要开启额外的进程.
这个例子直接使用API实现,并且利用了回调函数,实现了类似多线程的效果.

再多说几句吧,理论上程序在执行这个函数时能够接受GUI消息,比如按钮点击.但AU3好像使用了奇怪的消息循环,在复制文件时程序便会完全失去响应.

Global Const $PROGRESS_CONTINUE = 0
Global Const $PROGRESS_CANCEL   = 1
Global Const $PROGRESS_STOP   = 2
Global Const $PROGRESS_QUIET    = 3

_FileCopyEx("d:\Video\Clips\New\02.avi", "c:\02.avi")

Func _FileCopyEx($Source, $Dest)
    If Not FileExists($Source) Then Return SetError(1, 0, 0);检查文件是否存在
   
    ProgressOn("_FileCopyEx() Demo", "Copy, please wait...") ;开启进度条,此处可以换成其他控件
   
    $pCopyProgressRoutine = DllCallbackRegister("_CopyProgressRoutine", "int", "uint64;uint64;uint64;uint64;dword;dword;ptr;ptr;ptr");注册callback函数
   
    DllCall("kernel32.dll", "int", "CopyFileEx", _
      "str", $Source, _
      "str", $Dest, _
      "ptr", DllCallbackGetPtr($pCopyProgressRoutine), _
      "ptr", 0, _
      "int", 0, _
      "int", 0);调用API,第三个参数是callback函数的指针,文件每复制一段时间就调用这个callback函数
   
    DllCallbackFree($pCopyProgressRoutine);释放

EndFunc

Func _CopyProgressRoutine($TotalFileSize, $TotalBytesTransferred, $StreamSize, $StreamBytesTransferred, $dwStreamNumber, $dwCallbackReason, $hSourceFile, $hDestinationFile, $lpData)
   
    ;TotalFileSize:文件大小
    ;TotalBytesTransferred:已传输文件大小

    $Percent = $TotalBytesTransferred / $TotalFileSize * 100
   
    ProgressSet($Percent, "Percent: " & Round($Percent, 1) & "%") ;设置进度
   
    Return $PROGRESS_CONTINUE ;通过返回这个值来告诉系统继续复制,返回返回 PROGRESS_CANCEL终止

EndFunc   ;==>_CopyProgressRoutine

xrbenbeba 发表于 2009-2-13 20:24:54

大侠的API很强哦
你的贴都不错
顶~~~~~~~~~:face (35):

make2855 发表于 2009-2-15 09:44:14

猫大师总是在恰当的时候出现,给众人无限的惊喜。
回味大师的贴,真可谓字字是金啊!
:face (1):

虾子丙 发表于 2009-2-17 11:10:55

看到了!!
很强大!

windows0xp1 发表于 2009-3-7 13:54:03

谢谢分享。。。

xulihang 发表于 2009-3-7 14:36:59

谢谢分享!!

seeking 发表于 2009-3-7 16:37:42

很强
API...

anyliz 发表于 2009-3-10 09:36:40

这个函数可以复制文件夹么?

[ 本帖最后由 anyliz 于 2009-3-10 15:36 编辑 ]

YoDe 发表于 2009-3-14 04:09:38

学习乐.:face (29):

feelsky 发表于 2009-3-19 11:20:40

希望可以复制文件夹和增加FileCopy 的标志

我很菜,这个代码挺深奥的,研究不透

boyhong 发表于 2009-3-19 16:25:56

假死~~~~期待完美实现一下~~~要是完美实现~~~可以解决N多问题~~

wodechongwu 发表于 2009-3-20 00:54:34

说实话,我还是有大部分看不懂。

xinnetchina 发表于 2009-6-15 23:50:54

:face (21):

luke 发表于 2009-6-16 08:59:09

值得学习!
值得借鉴!
:face (23):

hpdeskjet 发表于 2009-7-21 13:46:32

谢谢分享!找了很久终于知道怎么搞了!
页: [1] 2 3 4
查看完整版本: 带进度的文件复制(不使用额外进程)