Jump to content

Copy From and Too with single progress bar Recursive


ChrisL
 Share

Recommended Posts

This seems to work OK, if you compile it you can run it from a command prompt or send the parrameters to the StartCopy function, Thanks to Lxp who did some of the original code for another project.

#include <file.au3>
Global $FileCount = 0
Global $FirstRunCount=0
Global $FileCount = 0
Global $QtyLeft=0


;StartCopy ("D:\Kiosk" , "D:\Kiosk2\")

If $cmdline[0] = 2 Then
    $DirSearch = $cmdline[1]
    $Destination = $cmdline[2]
    StartCopy ($DirSearch,$Destination)
Else
   ;MsgBox(0,'Invalid # of parameters!',$cmdline[0]&' is an Invalid number of parameters.')
   ;Exit
EndIf

Func StartCopy ($Var1, $Var2)

 If StringRight($Var1, 1) = '\' Then $Var1 = StringtrimRight( $Var1, 1 )
 If StringRight($Var2, 1) <> '\' Then $Var2 = $Var2 & '\'

$Var3 = $Var1

ProgressOn ("Copying Files",  " Please Wait: Copying: "  , "To ", -1,-1,16 )

processFolder($Var1, $Var2, $Var3)
debug ("Total Files Counted " & $FileCount)
$QtyLeft = $FileCount
$FirstRunCount=1
ProcessFolder ($Var1, $Var2, $Var3)

ProgressOff()
EndFunc


func processFolder($path,  $Destination, $Fixed)




    local $fileHandle, $file, $dirHandle, $dir

    local const $FILESPEC = "*.*"
 debug("Starting with " & $path)

 debug("Going to search for " & $path & "\" & $FILESPEC)
    $fileHandle = fileFindFirstFile($path & "\" & $FILESPEC)
    if ($fileHandle <> -1) then
        while (1)
            $file = fileFindNextFile($fileHandle)
            if (@error = 1) then exitLoop
            if ($file = "." or $file = "..") then continueLoop
            $file = $path & "\" & $file
            if (isFolder($file,$Destination, $Fixed)) then continueLoop
            copy($file, $Destination, $Fixed)

        wEnd
        fileClose($fileHandle)

    endIf

 debug("Going to search for subfolders")
    $dirHandle = fileFindFirstFile($path & "\*.*")
    if ($dirHandle <> -1) then
        while (1)
            $dir = fileFindNextFile($dirHandle)
            if (@error = 1) then exitLoop
            if ($dir = "." or $dir = "..") then continueLoop
            $dir = $path & "\" & $dir
            if (not(isFolder($dir,$Destination, $Fixed))) then continueLoop
      debug("Found subfolder " & $dir)
            processFolder($dir, $Destination, $Fixed)
        wEnd
        fileClose($dirHandle)
    endIf

endFunc

func isFolder($path,$Destination, $Fixed)
    if stringInStr(fileGetAttrib($path), "D") then 
    $stripped =stringreplace($Path, $Fixed &"\","")
    DirCreate ( $Destination & $Stripped )
    debug ("Path " & $Path)
    debug ("Creat Dir " & $Destination & $Stripped)
    return 1
    else
    Endif
    return 0
endFunc

func copy($text,$Destination, $Fixed)
$NewDir = $Destination
    $stripped =stringreplace($text, $fixed &"\","")
    if $FirstRunCount = 0 then 
    $FileCount = $FileCount + 1
        Else
        FileCopy ($text, $NewDir & $Stripped,1)
        $QtyLeft = $QtyLeft - 1
        $Percent =  $qtyLeft * 100 / $FileCount 
        $Percent1 = 100 - $Percent 
        ProgressSet ( $Percent1 + 1 ,"Copying " & $text & @CRLF & @CRLF & "To " & $NewDir & $Stripped  , " Please Wait: "  )
    Endif
endFunc

func debug($text)

  ;msgBox(0x40, "", $text)
    
endFunc
Edited by ChrisL
Link to comment
Share on other sites

I modified it....

#include <file.au3>
#include <Array.au3>
#include <GUIConstants.au3>

; Script Start - Add your code below here
GUICreate("Copying Files",420,100, -1,-1,-1, $WS_EX_TOOLWINDOW + $WS_EX_TOPMOST)
$progressbar1 = GUICtrlCreateProgress (10,20,400,20)
GUICtrlSetColor(-1,32250)
$Progress1Text = GUICtrlCreateLabel ( "Checking Files ", 10, 42 , 400 , 20, $SS_LEFTNOWORDWRAP  )
$progressbar2 = GUICtrlCreateProgress (10,60,400,20, $PBS_SMOOTH, )
$Progress2Text = GUICtrlCreateLabel ( "", 10, 82 , 400 , 20, $SS_LEFTNOWORDWRAP  )
GUISetFont (10, 600, )
$Progress2Text2 = GUICtrlCreateLabel ( "", 150, 62 , 400 , 20  )
GUICtrlSetColor(-1,0xffffff); not working with Windows XP Style
GUISetState (@SW_Show)




Global $FileCount = 0
Global $FirstRunCount=0
Global $QtyLeft=0
Global $CountFilesInCurrent=0
Global $Count2
Global $CurrentDirQty
Global $Percent2


;StartCopy ("D:\Kiosk" , "D:\Kiosk2\")

If $cmdline[0] = 2 Then
    $DirSearch = $cmdline[1]
    $Destination = $cmdline[2]
    StartCopy ($DirSearch,$Destination)
Else
   ;MsgBox(0,'Invalid # of parameters!',$cmdline[0]&' is an Invalid number of parameters.')
   ;Exit
EndIf

Func StartCopy ($Var1, $Var2)

 If StringRight($Var1, 1) = '\' Then $Var1 = StringtrimRight( $Var1, 1 )
 If StringRight($Var2, 1) <> '\' Then $Var2 = $Var2 & '\'

$Var3 = $Var1

;ProgressOn ("Copying Files",  " Please Wait: Copying: "  , "To ", -1,-1,16 )

processFolder($Var1, $Var2, $Var3)
debug ("Total Files Counted " & $FileCount)
$QtyLeft = $FileCount
$FirstRunCount=1
ProcessFolder ($Var1, $Var2, $Var3)

;ProgressOff()

        GUICtrlSetData ( $Progress1Text, "Complete"  )
        
        GUICtrlSetData ($progressbar2, 100)
        GUICtrlSetData ( $Progress2Text,   "Complete"  )
        GUICtrlSetData ( $Progress2Text2,   "Total Progress 100%")
Sleep (1000)
EndFunc


func processFolder($path,  $Destination, $Fixed)

    local $fileHandle, $file, $dirHandle, $dir
    
    

    local const $FILESPEC = "*.*"
 debug("Starting with " & $path)
$FirstCountFilesInCurrent = 0
$Count2 = 1


 debug("Going to search for " & $path & "\" & $FILESPEC)
    $fileHandle = fileFindFirstFile($path & "\" & $FILESPEC)
    if ($fileHandle <> -1) then
            If $FirstRunCount = 1 then 
            Count($Path)
            
            endif
    
    
    
        while (1)
            $file = fileFindNextFile($fileHandle)
            if (@error = 1) then exitLoop
            if ($file = "." or $file = "..") then continueLoop
            $file = $path & "\" & $file
            if (isFolder($file,$Destination, $Fixed)) then continueLoop
            copy($file, $Destination, $Fixed)
            If $FirstRunCount = 0 then $FirstCountFilesInCurrent = $FirstCountFilesInCurrent + 1


        wEnd
        

        fileClose($fileHandle)

    endIf

 debug("Going to search for subfolders")
    $dirHandle = fileFindFirstFile($path & "\*.*")
    if ($dirHandle <> -1) then
        while (1)
            $dir = fileFindNextFile($dirHandle)
            if (@error = 1) then exitLoop
            if ($dir = "." or $dir = "..") then continueLoop
            $dir = $path & "\" & $dir
            if (not(isFolder($dir,$Destination, $Fixed))) then continueLoop
      debug("Found subfolder " & $dir)
            processFolder($dir, $Destination, $Fixed)
           ;$CountFilesInCurrent = 1
            $CurrentPercent = 0
            
            
        wEnd
        fileClose($dirHandle)
    endIf

endFunc

func isFolder($path,$Destination, $Fixed)

    if stringInStr(fileGetAttrib($path), "D") then 
    $stripped =stringreplace($Path, $Fixed &"\","")
    DirCreate ( $Destination & $Stripped )
    debug ("Path " & $Path)
    debug ("Creat Dir " & $Destination & $Stripped)
    return 1
    else
    
    
    Endif
    return 0
    
endFunc

func copy($text,$Destination, $Fixed)

$NewDir = $Destination
    $stripped =stringreplace($text, $fixed &"\","")
    if $FirstRunCount = 0 then 
    $FileCount = $FileCount + 1
        Else
        
        
        
        
        
        Progress ($CurrentDirQty, $Count2)
        $QtyLeft = $QtyLeft - 1
        $Percent =  $qtyLeft * 100 / $FileCount 
        $Percent1 = 100 - $Percent 
        $Count2 = $Count2 + 1
    ;ProgressSet ( $Percent1 + 1 ,"Copying " & $text & @CRLF & @CRLF & "To " & $NewDir & $Stripped  , " Please Wait: "  )
        
        $aWholeNumber2 = StringSplit( $Percent2, "." )
    ;_arrayDisplay ( $aWholeNumber2, "")

        
        GUICtrlSetData ( $Progress1Text, $aWholeNumber2[1] & "% of Current Folder:- " & $Stripped  )
        $aWholeNumber = StringSplit( $Percent1, "." )
    ;_arrayDisplay ( $aWholeNumber, "")
        GUICtrlSetData ($progressbar2,$Percent1)
        GUICtrlSetData ( $Progress2Text,   $NewDir & $Stripped  )
        GUICtrlSetData ( $Progress2Text2,   "Total Progress " & $AWholeNumber[1] & "%" )
        
        FileCopy ($text, $NewDir & $Stripped,1)
        
    Endif
        
endFunc

Func Count($Dir)

local $fileHandle, $File, $Path, $Destination , $Fixed, $Count2


$fileHandle = fileFindFirstFile($Dir & "\" & "*.*")
    if ($fileHandle <> -1) then
        while (1)
            $file = fileFindNextFile($fileHandle)
    
            if (@error = 1) then exitLoop
            if ($file = "." or $file = "..") then continueLoop
            $file = $path & "\" & $file
            
            $Count2 = $Count2 + 1
            
    wend
                
   fileClose($FileHandle)        
Endif

$CurrentDirQty = $Count2

                        

Endfunc



func debug($text)
;If $FirstRunCount = 1 then msgBox(0x40, "", $text)
    
   
endFunc

Func Progress($CurrentDirQty, $Count2 )

$QtyLeft2 = $Count2 + 1
$QtyLeft2 = $QtyLeft2 - 1
$Percent2 =  $qtyLeft2 * 100 / $CurrentDirQty 
        
            GUICtrlSetData ($progressbar1,$Percent2)
            
EndFunc
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...