记得坛子里有人发过类似的东西,是通过命令行命令实现的,但那样需要开启额外的进程.
这个例子直接使用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
|