令狐大虾 发表于 5 天前

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

本帖最后由 令狐大虾 于 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进度条在屏幕正中顶部显示

邪恶海盗 发表于 5 天前

不懂,提供个思路,先把源目录下的所有文件名都写入一个数组,然后从数组的0-N挨个复制,进度条值就是当前的下标除以N...


二○二五年五月十日

zhaoceshi 发表于 5 天前

#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

h111666b 发表于 4 天前

$DIR_EXTENDED这个报错,需要什么函数支持?

redapple2008 发表于 3 天前

winmove guiontop

zhaoceshi 发表于 3 天前

h111666b 发表于 2025-5-11 08:45
$DIR_EXTENDED这个报错,需要什么函数支持?

#include <WindowsConstants.au3>

令狐大虾 发表于 前天 23:26

zhaoceshi 发表于 2025-5-10 19:43


谢谢,不需要手动选择的进度条。只需要预设制定路径的。希望改下

zhaoceshi 发表于 昨天 10:25

本帖最后由 zhaoceshi 于 2025-5-14 10:29 编辑

令狐大虾 发表于 2025-5-13 23:26
谢谢,不需要手动选择的进度条。只需要预设制定路径的。希望改下
你把手动选择的代码改成你指向的路径不就行了吗。。。。饭不能让人喂到你嘴里吧


Local $sSourceDir = FileSelectFolder("选择要复制的源文件夹", "")   改 Local $sSourceDir = 'c:\888'


页: [1]
查看完整版本: 有什么办法把下面复制文件进度条在屏幕中心顶部显示呢?