找回密码
 加入
搜索
查看: 62|回复: 4

[AU3基础] 有什么办法把下面复制文件进度条在屏幕中心顶部显示呢?

[复制链接]
发表于 前天 10:57 | 显示全部楼层 |阅读模式
本帖最后由 令狐大虾 于 2025-5-10 22:19 编辑
_DirCopy('d:\sf','d:\aaa') 
Func _DirCopy($SourceDir,$Destdir) 
    Local $Shell
    Local $FOF_SIMPLEPROGRESS = 16
    If Not FileExists($Destdir) Then DirCreate($Destdir)
    $Shell = ObjCreate("shell.application")
    $Shell.namespace($Destdir).CopyHere($SourceDir,$FOF_SIMPLEPROGRESS)
EndFunc

就是执行文件复制时候GUI进度条在屏幕正中顶部显示
发表于 前天 11:35 | 显示全部楼层
不懂,提供个思路,先把源目录下的所有文件名都写入一个数组,然后从数组的0-N挨个复制,进度条值就是当前的下标除以N...


二○二五年五月十日
发表于 前天 19:43 | 显示全部楼层
#include <File.au3>
#include <ProgressConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Main()

Func Main()
    ; 选择源文件夹
    Local $sSourceDir = FileSelectFolder("选择要复制的源文件夹", "")
    If @error Then Exit
    
    ; 选择目标文件夹
    Local $sDestDir = FileSelectFolder("选择目标文件夹", "")
    If @error Then Exit
    
    ; 获取源文件夹名称
    Local $sFolderName = StringRegExpReplace($sSourceDir, "^.*\", "")
    
    ; 创建目标路径
    $sDestDir = $sDestDir & "" & $sFolderName
    
    ; 检查目标文件夹是否已存在
    If FileExists($sDestDir) Then
        Local $iAnswer = MsgBox(4, "警告", "目标文件夹已存在,是否覆盖?")
        If $iAnswer <> 6 Then Exit ; 6 = "是"
    EndIf
    
    ; 创建进度条GUI
    Local $hGUI = GUICreate("复制进度", 400, 150)
    Local $idProgress = GUICtrlCreateProgress(20, 50, 360, 30)
    Local $idLabel = GUICtrlCreateLabel("准备复制...", 20, 20, 360, 20)
    Local $idFileLabel = GUICtrlCreateLabel("", 20, 90, 360, 20)
    GUISetState(@SW_SHOW, $hGUI)
    
    ; 计算总文件数用于进度
    Local $iTotalFiles = _FileCountFiles($sSourceDir, "*", $DIR_EXTENDED)
    Local $iCopiedFiles = 0
    
    ; 开始复制
    _CopyFolderWithProgress($sSourceDir, $sDestDir, $iTotalFiles, $iCopiedFiles, $idProgress, $idLabel, $idFileLabel)
    
    ; 完成消息
    GUICtrlSetData($idLabel, "复制完成!")
    MsgBox(0, "完成", "文件夹复制完成!")
    GUIDelete($hGUI)
EndFunc

; 递归复制文件夹并更新进度条
Func _CopyFolderWithProgress($sSource, $sDest, $iTotalFiles, ByRef $iCopiedFiles, $idProgress, $idLabel, $idFileLabel)
    ; 创建目标文件夹
    DirCreate($sDest)
    
    ; 查找源文件夹中的所有文件和子文件夹
    Local $hSearch = FileFindFirstFile($sSource & "\*")
    If $hSearch = -1 Then Return
    
    While 1
        Local $sFile = FileFindNextFile($hSearch)
        If @error Then ExitLoop
        
        Local $sSourcePath = $sSource & "" & $sFile
        Local $sDestPath = $sDest & "" & $sFile
        
        ; 如果是目录则递归处理
        If @extended Then
            _CopyFolderWithProgress($sSourcePath, $sDestPath, $iTotalFiles, $iCopiedFiles, $idProgress, $idLabel, $idFileLabel)
        Else
            ; 复制文件并更新进度
            GUICtrlSetData($idLabel, "正在复制文件 " & $iCopiedFiles + 1 & "/" & $iTotalFiles)
            GUICtrlSetData($idFileLabel, "当前文件: " & $sFile)
            
            FileCopy($sSourcePath, $sDestPath, $FC_OVERWRITE + $FC_CREATEPATH)
            
            $iCopiedFiles += 1
            Local $iPercent = ($iCopiedFiles / $iTotalFiles) * 100
            GUICtrlSetData($idProgress, $iPercent)
            
            ; 保持界面响应
            Sleep(10) ; 可以调整或删除这个延迟
            If GUIGetMsg() = $GUI_EVENT_CLOSE Then Exit
        EndIf
    WEnd
    
    FileClose($hSearch)
EndFunc

; 计算文件夹中文件总数的函数
Func _FileCountFiles($sPath, $sFilter = "*", $iFlags = 0)
    Local $iCount = 0
    Local $hSearch = FileFindFirstFile($sPath & "" & $sFilter)
    
    If $hSearch <> -1 Then
        While 1
            Local $sFile = FileFindNextFile($hSearch)
            If @error Then ExitLoop
            
            If @extended Then
                ; 如果是目录且需要递归
                If BitAND($iFlags, $DIR_EXTENDED) Then
                    $iCount += _FileCountFiles($sPath & "" & $sFile, $sFilter, $iFlags)
                EndIf
            Else
                $iCount += 1
            EndIf
        WEnd
        FileClose($hSearch)
    EndIf
    
    Return $iCount
EndFunc
发表于 昨天 08:45 | 显示全部楼层
$DIR_EXTENDED  这个报错,需要什么函数支持?
发表于 半小时前 | 显示全部楼层
winmove guiontop
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2025-5-12 20:12 , Processed in 0.082850 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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