带进度的文件复制(不使用额外进程)
记得坛子里有人发过类似的东西,是通过命令行命令实现的,但那样需要开启额外的进程.这个例子直接使用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 大侠的API很强哦
你的贴都不错
顶~~~~~~~~~:face (35): 猫大师总是在恰当的时候出现,给众人无限的惊喜。
回味大师的贴,真可谓字字是金啊!
:face (1): 看到了!!
很强大! 谢谢分享。。。 谢谢分享!! 很强
API... 这个函数可以复制文件夹么?
[ 本帖最后由 anyliz 于 2009-3-10 15:36 编辑 ] 学习乐.:face (29): 希望可以复制文件夹和增加FileCopy 的标志
我很菜,这个代码挺深奥的,研究不透 假死~~~~期待完美实现一下~~~要是完美实现~~~可以解决N多问题~~ 说实话,我还是有大部分看不懂。 :face (21): 值得学习!
值得借鉴!
:face (23): 谢谢分享!找了很久终于知道怎么搞了!