找回密码
 加入
搜索
查看: 248514|回复: 44

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

 火... [复制链接]
发表于 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

评分

参与人数 1金钱 +10 贡献 +10 收起 理由
顽固不化 + 10 + 10

查看全部评分

发表于 2009-2-13 20:24:54 | 显示全部楼层
大侠的API很强哦
你的贴都不错
顶~~~~~~~~~
发表于 2009-2-15 09:44:14 | 显示全部楼层
猫大师总是在恰当的时候出现,给众人无限的惊喜。
回味大师的贴,真可谓字字是金啊!
发表于 2009-2-17 11:10:55 | 显示全部楼层
看到了!!
很强大!
发表于 2009-3-7 13:54:03 | 显示全部楼层
谢谢分享。。。
发表于 2009-3-7 14:36:59 | 显示全部楼层
谢谢分享!!
发表于 2009-3-7 16:37:42 | 显示全部楼层
很强
API...
发表于 2009-3-10 09:36:40 | 显示全部楼层
这个函数可以复制文件夹么?

[ 本帖最后由 anyliz 于 2009-3-10 15:36 编辑 ]
发表于 2009-3-14 04:09:38 | 显示全部楼层
学习乐.
发表于 2009-3-19 11:20:40 | 显示全部楼层
希望可以复制文件夹和增加FileCopy 的标志

我很菜,这个代码挺深奥的,研究不透
发表于 2009-3-19 16:25:56 | 显示全部楼层
假死~~~~期待完美实现一下~~~要是完美实现~~~可以解决N多问题~~
发表于 2009-3-20 00:54:34 | 显示全部楼层
说实话,我还是有大部分看不懂。
发表于 2009-6-15 23:50:54 | 显示全部楼层
发表于 2009-6-16 08:59:09 | 显示全部楼层
值得学习!
值得借鉴!
发表于 2009-7-21 13:46:32 | 显示全部楼层
谢谢分享!找了很久终于知道怎么搞了!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-4-25 03:32 , Processed in 0.081448 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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