Yashied

Copy UDF

84 posts in this topic

#1 ·  Posted (edited)

LAST VERSION - 1.4

18-May-12

This small library allows simple and reliable way to copy or move files and directories without suspending your script. Moreover, you can get the current state (number of copied bytes, system error code, and other status information) while copying. Also supported copying or moving a multiple files and directories at once (up to 256). Working with this UDF is similar with the InetGet() function. For more information, see description for each function within the library.

Copy.png

Available functions

_Copy_Abort

_Copy_CallbackDlg

_Copy_CloseDll

_Copy_CopyDir

_Copy_CopyFile

_Copy_GetAction

_Copy_GetState

_Copy_MoveDir

_Copy_MoveFile

_Copy_OpenDll

_Copy_Pause

Copy UDF Library v1.4 (x86 and x64)

Previous downloads: 1162

Copy.zip

Examples

Copying a single file

#Include <Misc.au3>

#Include "Copy.au3"

Opt('TrayAutoPause', 0)

$Source = 'C:\Test.tmp'
$Destination = 'C:\Test (2).tmp'

_Copy_OpenDll()
_Copy_CopyFile($Source, $Destination)
Do
    Sleep(250)
    $State = _Copy_GetState()
    ConsoleWrite(StringFormat('%.2f%', $State[1] / $State[2] * 100) & @CR)
    If _IsPressed('1B') Then
        _Copy_Abort()
    EndIf
Until Not $State[0]
ConsoleWrite('Return code: ' & $State[5] & @CR)
_Copy_CloseDll()

Copying a multiple files at once

#Include <Misc.au3>

#Include "Copy.au3"

Opt('TrayAutoPause', 0)

$Source1 = 'C:\Test1.tmp'
$Destination1 = 'C:\Test1 (2).tmp'

$Source2 = 'C:\Test2.tmp'
$Destination2 = 'C:\Test2 (2).tmp'

_Copy_OpenDll()
_Copy_CopyFile($Source1, $Destination1, 0, 0)
_Copy_CopyFile($Source2, $Destination2, 0, 1)
Do
    Sleep(250)
    $State1 = _Copy_GetState(0)
    $State2 = _Copy_GetState(1)
    ConsoleWrite(StringFormat('%.2f%   %.2f%', $State1[1] / $State1[2] * 100, $State2[1] / $State2[2] * 100) & @CR)
    If _IsPressed('1B') Then
        _Copy_Abort(0)
        _Copy_Abort(1)
    EndIf
Until (Not $State1[0]) And (Not $State2[0])
ConsoleWrite('Return code #1: ' & $State1[5] & @CR)
ConsoleWrite('Return code #2: ' & $State2[5] & @CR)
_Copy_CloseDll()

GUI, files copying

#Include <EditConstants.au3>
#Include <GUIConstantsEx.au3>

#Include "Copy.au3"

Opt('MustDeclareVars', 1)
Opt('TrayAutoPause', 0)

Global $hForm, $Input1, $Input2, $Button1, $Button2, $Button3, $Button4, $Data, $Msg, $Path, $Progress, $State, $Copy = False, $Pause = False
Global $Source = '', $Destination = ''

If Not _Copy_OpenDll() Then
    MsgBox(16, '', 'DLL not found.')
    Exit
EndIf

$hForm = GUICreate('MyGUI', 360, 163)
GUICtrlCreateLabel('Source:', 14, 23, 58, 14)
$Input1 = GUICtrlCreateInput('', 74, 20, 248, 19, BitOR($ES_AUTOHSCROLL, $ES_LEFT, $ES_MULTILINE))
GUICtrlSetState(-1, $GUI_DISABLE)
$Button1 = GUICtrlCreateButton('...', 326, 19, 21, 21)
GUICtrlCreateLabel('Destination:', 14, 55, 58, 14)
$Input2 = GUICtrlCreateInput('', 74, 52, 248, 19, BitOR($ES_AUTOHSCROLL, $ES_LEFT, $ES_MULTILINE))
GUICtrlSetState(-1, $GUI_DISABLE)
$Button2 = GUICtrlCreateButton('...', 326, 51, 21, 21)
$Progress = GUICtrlCreateProgress(14, 94, 332, 16)
$Button3 = GUICtrlCreateButton('Copy', 135, 126, 80, 21)
$Button4 = GUICtrlCreateButton(';', 326, 126, 21, 21)
GUICtrlSetFont(-1, 10, 400, 0, 'Webdings')
GUICtrlSetState(-1, $GUI_DISABLE)
GUISetState()

While 1
    If $Copy Then
        $State = _Copy_GetState()
        If $State[0] Then
            $Data = Round($State[1] / $State[2] * 100)
            If GUICtrlRead($Progress) <> $Data Then
                GUICtrlSetData($Progress, $Data)
            EndIf
        Else
            Switch $State[5]
                Case 0
                    GUICtrlSetData($Progress, 100)
                    MsgBox(64, '', 'File was successfully copied.', 0, $hForm)
                Case 1235 ; ERROR_REQUEST_ABORTED
                    MsgBox(16, '', 'File copying was aborted.', 0, $hForm)
                Case Else
                    MsgBox(16, '', 'File was not copied.' & @CR & @CR & $State[5], 0, $hForm)
            EndSwitch
            GUICtrlSetData($Progress, 0)
            GUICtrlSetState($Button1, $GUI_ENABLE)
            GUICtrlSetState($Button2, $GUI_ENABLE)
            GUICtrlSetState($Button4, $GUI_DISABLE)
            GUICtrlSetData($Button3, 'Copy')
            GUICtrlSetData($Button4, ';')
            $Copy = 0
        EndIf
    EndIf
    $Msg = GUIGetMsg()
    Switch $Msg
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $Button1
            $Path = FileOpenDialog('Select Source File', StringRegExpReplace($Source, '\\[^\\]*\Z', ''), 'All Files (*.*)', 3, StringRegExpReplace($Source, '^.*\\', ''), $hForm)
            If $Path Then
                GUICtrlSetData($Input1, $Path)
                $Source = $Path
            EndIf
        Case $Button2
            $Path = FileOpenDialog('Select Destination File', StringRegExpReplace($Destination, '\\[^\\]*\Z', ''), 'All Files (*.*)', 2, StringRegExpReplace($Source, '^.*\\', ''), $hForm)
            If $Path Then
                GUICtrlSetData($Input2, $Path)
                $Destination = $Path
            EndIf
        Case $Button3
            If $Copy Then
                _Copy_Abort()
            Else
                If (Not $Source) Or (Not $Destination) Then
                    MsgBox(16, '', 'The source and destination file names must be specified.', 0, $hForm)
                    ContinueLoop
                EndIf
                If FileExists($Destination) Then
                    If MsgBox(51, '', $Destination & ' already exists.' & @CR & @CR & 'Do you want to replace it?', 0, $hForm) <> 6 Then
                        ContinueLoop
                    EndIf
                EndIf
                GUICtrlSetState($Button1, $GUI_DISABLE)
                GUICtrlSetState($Button2, $GUI_DISABLE)
                GUICtrlSetState($Button4, $GUI_ENABLE)
                GUICtrlSetData($Button3, 'Abort')
                _Copy_CopyFile($Source, $Destination)
                $Copy = 1
            EndIf
        Case $Button4
            $Pause = Not $Pause
            If $Pause Then
                GUICtrlSetData($Button4, '4')
            Else
                GUICtrlSetData($Button4, ';')
            EndIf
            _Copy_Pause($Pause)
    EndSwitch
WEnd

GUI, directories copying

#Include <EditConstants.au3>
#Include <GUIConstantsEx.au3>

#Include "Copy.au3"

Opt('MustDeclareVars', 1)
Opt('TrayAutoPause', 0)

Global $hForm, $Input1, $Input2, $Button1, $Button2, $Button3, $Button4, $Label, $Data, $Msg, $Path, $Progress, $State, $Copy = False, $Pause = False
Global $Source = '', $Destination = ''

If Not _Copy_OpenDll() Then
    MsgBox(16, '', 'DLL not found.')
    Exit
EndIf

$hForm = GUICreate('MyGUI', 360, 175)
GUICtrlCreateLabel('Source:', 14, 23, 58, 14)
$Input1 = GUICtrlCreateInput('', 74, 20, 248, 19, BitOR($ES_AUTOHSCROLL, $ES_LEFT, $ES_MULTILINE))
GUICtrlSetState(-1, $GUI_DISABLE)
$Button1 = GUICtrlCreateButton('...', 326, 19, 21, 21)
GUICtrlCreateLabel('Destination:', 14, 55, 58, 14)
$Input2 = GUICtrlCreateInput('', 74, 52, 248, 19, BitOR($ES_AUTOHSCROLL, $ES_LEFT, $ES_MULTILINE))
GUICtrlSetState(-1, $GUI_DISABLE)
$Button2 = GUICtrlCreateButton('...', 326, 51, 21, 21)
$Label = GUICtrlCreateLabel('',14, 91, 332, 14)
$Progress = GUICtrlCreateProgress(14, 106, 332, 16)
$Button3 = GUICtrlCreateButton('Copy', 135, 138, 80, 21)
$Button4 = GUICtrlCreateButton(';', 326, 138, 21, 21)
GUICtrlSetFont(-1, 10, 400, 0, 'Webdings')
GUICtrlSetState(-1, $GUI_DISABLE)
GUISetState()

While 1
    If $Copy Then
        $State = _Copy_GetState()
        If $State[0] Then
            If $State[0] = -1 Then
                ; Preparing
            Else
                $Data = Round($State[1] / $State[2] * 100)
                If GUICtrlRead($Progress) <> $Data Then
                    GUICtrlSetData($Progress, $Data)
                EndIf
                $Data = StringRegExpReplace($State[6], '^.*\\', '')
                If GUICtrlRead($Label) <> $Data Then
                    GUICtrlSetData($Label, $Data)
                EndIf
            EndIf
        Else
            Switch $State[5]
                Case 0
                    GUICtrlSetData($Progress, 100)
                    MsgBox(64, '', 'Folder was successfully copied.', 0, $hForm)
                Case 1235 ; ERROR_REQUEST_ABORTED
                    MsgBox(16, '', 'Folder copying was aborted.', 0, $hForm)
                Case Else
                    MsgBox(16, '', 'Folder was not copied.' & @CR & @CR & $State[5], 0, $hForm)
            EndSwitch
            GUICtrlSetState($Button1, $GUI_ENABLE)
            GUICtrlSetState($Button2, $GUI_ENABLE)
            GUICtrlSetState($Button4, $GUI_DISABLE)
            GUICtrlSetData($Progress, 0)
            GUICtrlSetData($Label, '')
            GUICtrlSetData($Button3, 'Copy')
            GUICtrlSetData($Button4, ';')
            $Copy = 0
        EndIf
    EndIf
    $Msg = GUIGetMsg()
    Switch $Msg
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $Button1
            $Path = FileSelectFolder('Select source folder that to be copied.', '', 2, $Source, $hForm)
            If $Path Then
                GUICtrlSetData($Input1, $Path)
                $Source = $Path
            EndIf
        Case $Button2
            $Path = FileSelectFolder('Select destination folder in which will be copied the source directory.', '', 2, $Destination, $hForm)
            If $Path Then
                GUICtrlSetData($Input2, $Path)
                $Destination = $Path
            EndIf
        Case $Button3
            If $Copy Then
                _Copy_Abort()
            Else
                If (Not $Source) Or (Not $Destination) Then
                    MsgBox(16, '', 'The source and destination folders must be specified.', 0, $hForm)
                    ContinueLoop
                EndIf
                $Path = $Destination & '\' & StringRegExpReplace($Source, '^.*\\', '')
                If FileExists($Path) Then
                    If MsgBox(51, 'Copy', $Path & ' already exists.' & @CR & @CR & 'Do you want to merge folders?', 0, $hForm) <> 6 Then
                        ContinueLoop
                    EndIf
                EndIf
                GUICtrlSetState($Button1, $GUI_DISABLE)
                GUICtrlSetState($Button2, $GUI_DISABLE)
                GUICtrlSetState($Button4, $GUI_ENABLE)
                GUICtrlSetData($Label, 'Preparing...')
                GUICtrlSetData($Button3, 'Abort')
                _Copy_CopyDir($Source, $Path, 0, 0, 0, '_Copy_CallbackDlg', $hForm)
                $Copy = 1
            EndIf
        Case $Button4
            $Pause = Not $Pause
            If $Pause Then
                GUICtrlSetData($Button4, '4')
            Else
                GUICtrlSetData($Button4, ';')
            EndIf
            _Copy_Pause($Pause)
    EndSwitch
WEnd

Edited by Yashied
4 people like this

Share this post


Link to post
Share on other sites



Yashied

You rock.. Thanks for this UDF

Best regards,

Emiel


Best regards,Emiel Wieldraaijer

Share this post


Link to post
Share on other sites

#3 ·  Posted (edited)

Another example of a recursive copying directories (like Explorer). Here the "Source" and "Destination" folders should exist on disk.

#Include <Copy.au3>
#Include <GUIConstantsEx.au3>

Opt('GUIOnEventMode', 1)
Opt('MustDeclareVars', 1)
Opt('TrayAutoPause', 0)

Global Const $Source = 'C:\Source'
Global Const $Destination = 'C:\Destination'

Global $hForm, $Button, $Label1, $Label2, $Progress1, $Progress2
Global $DirSize, $CurSize, $Abort = False

If Not _Copy_OpenDll() Then
    MsgBox(16, '', 'Copy.dll not found.')
    Exit
EndIf

$hForm = GUICreate('Copying', 400, 146)
GUISetOnEvent($GUI_EVENT_CLOSE, '_Event')
$Label1 = GUICtrlCreateLabel($Destination, 16, 17, 368, 14)
GUICtrlSetData(-1, $Destination)
$Progress1 = GUICtrlCreateProgress(16, 33, 368, 16)
$Label2 = GUICtrlCreateLabel('Prepare...', 16, 63, 368, 14)
$Progress2 = GUICtrlCreateProgress(16, 79, 368, 16)
$Button = GUICtrlCreateButton('Cancel', 305, 110, 80, 25)
GUICtrlSetState(-1, $GUI_DEFBUTTON)
GUICtrlSetOnEvent(-1, '_Event')
GUISetState()

_Copy($Source, $Destination)

Switch @error
    Case 0
        MsgBox(64, '', 'The files copying is complete successfully.', 0, $hForm)
    Case 1235 ; ERROR_REQUEST_ABORTED
        MsgBox(16, '', 'The files copying was aborted by user.', 0, $hForm)
    Case Else
        MsgBox(16, '', 'The files not copied. ' & @CR & @CR & @error, 0, $hForm)
EndSwitch

_Copy_CloseDll()

Func _Event()
    Switch @GUI_CtrlID
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button
            $Abort = 1
    EndSwitch
EndFunc   ;==>_Event

Func _Copy($sSource, $sDestination, $fReplace = False, $iFlags = 0, $sRoot = '')

    Local $sPath, $sFile, $hSearch, $Percent, $Result, $Size, $State, $Error = -1

    If Not $sRoot Then
        $DirSize = DirGetSize($sSource)
        $CurSize = 0
    EndIf
    $hSearch = FileFindFirstFile($sSource & $sRoot & '\*.*')
    If $hSearch = -1 Then
        Switch @error
            Case 1 ; Folder is empty

            Case Else
                Return SetError(-1, 0, 0)
        EndSwitch
    EndIf
    While 1
        $sFile = FileFindNextFile($hSearch)
        If @error Then
            FileClose($hSearch)
            Return 1
        EndIf
        $sPath = $sRoot & '\' & $sFile
        If @extended Then
            GUICtrlSetData($Label1, $sDestination & $sPath)
            If Not FileExists($sDestination & $sPath) Then
                If Not DirCreate($sDestination & $sPath) Then
                    ExitLoop
                EndIf
                FileSetAttrib($sDestination & $sPath, '+' & StringReplace(FileGetAttrib($sSource & $sPath), 'D', ''))
            EndIf
            If Not _Copy($sSource, $sDestination, $fReplace, $iFlags, $sPath) Then
                $Error = @error
                ExitLoop
            EndIf
        Else
            GUICtrlSetData($Label2, $sFile)
            GUICtrlSetData($Progress2, 0)
            $Size = FileGetSize($sSource & $sPath)
            If @error Then
                ExitLoop
            EndIf
            Do
                If (Not $fReplace) And (FileExists($sDestination & $sPath)) Then
                    $Result = MsgBox(35, '', $sDestination & $sPath & ' already exists.' & @CR & @CR & 'Do you want to replace it?', 0, $hForm)
                    Switch $Result
                        Case 2 ; "CANCEL"
                            $Error = 1235 ; ERROR_REQUEST_ABORTED
                            ExitLoop 2
                        Case 7 ; "NO"
                            ExitLoop
                    EndSwitch
                EndIf
                If Not _Copy_CopyFile($sSource & $sPath, $sDestination & $sPath, $iFlags) Then
                    ExitLoop 2
                EndIf
                While 1
                    If $Abort Then
                        _Copy_Abort()
                    EndIf
                    $State = _Copy_GetState()
                    If $State[0] Then
                        $Percent = Round($State[1] / $Size * 100)
                        If GUICtrlRead($Progress2) <> $Percent Then
                            GUICtrlSetData($Progress2, $Percent)
                        EndIf
                        $Percent = Round(($CurSize + $State[1]) / $DirSize * 100)
                        If GUICtrlRead($Progress1) <> $Percent Then
                            GUICtrlSetData($Progress1, $Percent)
                        EndIf
                    Else
                        If Not $State[2] Then
                            GUICtrlSetData($Progress2, 100)
                        Else
                            $Error = $State[2]
                            ExitLoop 3
                        EndIf
                        ExitLoop 2
                    EndIf
                WEnd
                If Not StringInStr(FileGetAttrib($sSource & $sPath), 'A') Then
                    FileSetAttrib($sDestination & $sPath, '-A')
                EndIf
            Until 1
            $CurSize += $Size
            $Percent = Round($CurSize / $DirSize * 100)
            If GUICtrlRead($Progress1) <> $Percent Then
                GUICtrlSetData($Progress1, $Percent)
            EndIf
        EndIf
    WEnd
    FileClose($hSearch)
    Return SetError($Error, 0, 0)
EndFunc   ;==>_EnumFiles
Edited by Yashied

Share this post


Link to post
Share on other sites

Share this post


Link to post
Share on other sites

#6 ·  Posted (edited)

Another Example based on the recurvice folder copy example from Yashied

#NoTrayIcon
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <UpDownConstants.au3>
#include <EditConstants.au3>
#include "Copy.au3"

If Not _Copy_OpenDll() Then
    MsgBox(16, '', 'Copy.dll not found.')
    Exit
EndIf

Dim $Version = "1.0.0"
Dim $Website = "http://www.autoitscript.com"
Dim $Menu[7], $Button[4], $Progress1, $Progress2, $Percent, $Size, $State, $Copy = 0
Dim $DirSize[3], $DirSizeAfter[4], $Max[4], $CurSize, $Abort = False
Dim $Title = "Copy Folder"

$Source = IniRead(@ScriptDir & "\CFBackup.ini", "Settings", "Source", "")
$Destination = IniRead(@ScriptDir & "\CFBackup.ini", "Settings", "Destination", "")
$Days = IniRead(@ScriptDir & "\CFBackup.ini", "Settings", "Days", "7")
$Current = IniRead(@ScriptDir & "\CFBackup.ini", "Settings", "Current", "")
$Erase = IniRead(@ScriptDir & "\CFBackup.ini", "Settings", "Erase", "NO")

$GUI = GUICreate($Title, 440, 390)

$Menu[1] = GUICtrlCreateMenu("&File")
$Menu[4] = GUICtrlCreateMenuItem("E&xit", $Menu[1])
$Menu[2] = GUICtrlCreateMenu("Options")
$Menu[5] = GUICtrlCreateMenuItem("&Erase folder ", $Menu[2])
$Menu[3] = GUICtrlCreateMenu("&?")
$Menu[6] = GUICtrlCreateMenuItem("Website &AutoItScripts", $Menu[3])

If $Erase = "YES" Then GUICtrlSetState($Menu[5], $GUI_Checked)

GUICtrlCreateGroup("Source : ", 10, 20, 415, 55)
$SourceInput = GUICtrlCreateInput("", 20, 40, 365, 20)
GUICtrlSetState(-1, $GUI_Disable)
GUICtrlSetData(-1, $Source)
$Button[1] = GUICtrlCreateButton("...", 395, 40, 20, 20)
GUICtrlSetTip(-1, "Select source folder", "", 0, 2)

GUICtrlCreateGroup("Target : ", 10, 80, 415, 55)
$DestinationInput = GUICtrlCreateInput("", 20, 100, 365, 20)
GUICtrlSetState(-1, $GUI_Disable)
GUICtrlSetData(-1, $Destination)

$Button[2] = GUICtrlCreateButton("...", 395, 100, 20, 20)
GUICtrlSetTip(-1, "Select target folder", "", 0, 2)

GUICtrlCreateGroup("Status : ", 10, 140, 415, 175)

GUICtrlCreateLabel("File...........................", 20, 160, 95, 20)
$Label = GUICtrlCreateInput("", 120, 158, 295, 20)
GUICtrlSetState(-1, $GUI_Disable)

GUICtrlCreateLabel("Current...............................", 20, 180, 95, 20)
$Progress2 = GUICtrlCreateProgress(120, 178, 295, 20)

GUICtrlCreateLabel("Total.............................", 20, 200, 95, 20)
$Progress1 = GUICtrlCreateProgress(120, 198, 295, 20)

GUICtrlCreateLabel("Files..........................", 20, 240, 95, 20)
$TotalFiles = GUICtrlCreateInput("", 120, 238, 110, 20, $SS_RIGHT)
GUICtrlSetState(-1, $GUI_Disable)

GUICtrlCreateLabel("Folders..........................", 20, 260, 95, 20)
$TotalFolders = GUICtrlCreateInput("", 120, 258, 110, 20, $SS_RIGHT)
GUICtrlSetState(-1, $GUI_Disable)

GUICtrlCreateLabel("Size(MB)...................", 20, 280, 95, 20)
$CurrentSize = GUICtrlCreateInput("", 120, 278, 110, 20, $SS_RIGHT)
GUICtrlSetState(-1, $GUI_Disable)

$Last2 = GUICtrlCreateLabel("Last................................", 240, 240, 100, 20)
GUICtrlSetTip(-1, "Last subfolder used for Backup", "", 0, 2)

$Last = GUICtrlCreateInput("-", 345, 238, 70, 20, $SS_RIGHT)
If $Current = "" Then
    $Current = 1
ElseIf $Current = 1 Then
    GUICtrlSetData($Last, $Days)
Else
    GUICtrlSetData($Last, $Current - 1)
EndIf
GUICtrlSetState(-1, $GUI_Disable)

$Next2 = GUICtrlCreateLabel("Next...........................", 240, 260, 100, 20)
GUICtrlSetTip(-1, "Next subfolder used for Backup", "", 0, 2)
$Next = GUICtrlCreateInput($Current, 345, 258, 70, 20, $SS_RIGHT)
GUICtrlSetState(-1, $GUI_Disable)

$Max[1] = GUICtrlCreateInput($Days, 345, 278, 70, 20, $ES_READONLY + $SS_RIGHT)
$Max[2] = GUICtrlCreateLabel("Maximum........................", 240, 280, 100, 20)
GUICtrlSetTip(-1, "Maximum subfolders used for Backup", "", 0, 2)
$Max[3] = GUICtrlCreateUpdown($Max[1], 0x21)
GUICtrlSetLimit(-1, 999, 2)

$Button[3] = GUICtrlCreateButton("Copy", 340, 330, 80, 20)
GUICtrlSetState(-1, $GUI_DEFBUTTON)

GUISetState()

_ReduceMemory()

Func _ButtonControl($Value)
    For $i = 1 To 3
        GUICtrlSetState($Button[$i], $Value)
    Next
EndFunc   ;==>_ButtonControl

While 1
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then _Terminate()
    Switch $msg
        Case -100 To 0
            ContinueLoop
        Case $msg = $GUI_EVENT_CLOSE
            _Terminate()
        Case $msg = $Menu[4]
            _Terminate()
        Case $Button[1]
            $FolderSelect = FileSelectFolder("Select source folder", "", 3, GUICtrlRead($SourceInput))
            If $FolderSelect <> "" Then
                GUICtrlSetData($SourceInput, $FolderSelect)
                IniWrite(@ScriptDir & "\CFBackup.ini", "Settings", "Source", $FolderSelect)
                $FolderInfo = DirGetSize($FolderSelect)
            EndIf
        Case $Button[2]
            $FolderSelect = FileSelectFolder("Select target folder", "", 3, GUICtrlRead($DestinationInput))
            If $FolderSelect <> "" Then
                GUICtrlSetData($DestinationInput, $FolderSelect)
                IniWrite(@ScriptDir & "\CFBackup.ini", "Settings", "Destination", $FolderSelect)
            EndIf
        Case $Button[3]
            If GUICtrlRead($Button[3]) = "Abort" Then
                $Abort = 1
                GUICtrlSetData($Button[3], "Copy")
            Else
                IniWrite(@ScriptDir & "\CFBackup.ini", "Settings", "Days", GUICtrlRead($Max[1]))
                If GUICtrlRead($SourceInput) = "" Or GUICtrlRead($DestinationInput) = "" Then
                    _ButtonControl($GUI_Disable)
                    MsgBox(16, '', 'The source and destination must be specified.', 0, $GUI)
                    _ButtonControl($GUI_Enable)
                ElseIf GUICtrlRead($SourceInput) = GUICtrlRead($DestinationInput) Then
                    _ButtonControl($GUI_Disable)
                    MsgBox(16, '', 'The source and destination must be different.', 0, $GUI)
                    _ButtonControl($GUI_Enable)
                Else
                    GUICtrlSetData($Progress1, 0)
                    GUICtrlSetData($Button[3], "Abort")
                    GUICtrlSetState($Button[1], $GUI_Disable)
                    GUICtrlSetState($Button[2], $GUI_Disable)
                    GUICtrlSetData($Next2, "Current............................")
                    GUICtrlSetTip($Next2, "Current subfolder used for Backup", "", 0, 2)

                    If $Erase = "YES" Then _Flush(GUICtrlRead($DestinationInput) & '\' & $Current)

                    $TimeStart = TimerInit()
                    $sFileCount = 0
                    $sFolderCount = 0
                    _CopyData(GUICtrlRead($SourceInput), GUICtrlRead($DestinationInput) & '\' & $Current, True)
                    Switch @error
                        Case 0
                            $TimeEnd = Round(TimerDiff($TimeStart) / 1000)
                            $DirSizeAfter = DirGetSize(GUICtrlRead($DestinationInput) & '\' & $Current, 1)
                            GUICtrlSetState($Button[3], $GUI_Disable)
                            MsgBox(64, '', 'Copied ' & $DirSizeAfter[1] & ' files successfully in ' & $TimeEnd & ' Seconds.', 0, $GUI)
                        Case 1235 ; ERROR_REQUEST_ABORTED
                            $TimeEnd = Round(TimerDiff($TimeStart) / 1000)
                            GUICtrlSetState($Button[3], $GUI_Disable)
                            MsgBox(16, '', 'Copy was aborted by user.', 0, $GUI)
                        Case Else
                            $TimeEnd = Round(TimerDiff($TimeStart) / 1000)
                            GUICtrlSetState($Button[3], $GUI_Disable)
                            MsgBox(16, '', 'No files were copied. ' & @CR & @CR & @error, 0, $GUI)
                    EndSwitch
                    GUICtrlSetData($Next2, "Next...............")
                    GUICtrlSetTip(-1, "Next subfolder used for Backup", "", 0, 2)
                    $Current = $Current + 1
                    If $Current > $Days Then $Current = 1
                    IniWrite(@ScriptDir & "\CFBackup.ini", "Settings", "Current", $Current)

                    If $Current - 1 = 0 Then
                        GUICtrlSetData($Last, $Days)
                    Else
                        GUICtrlSetData($Last, $Current - 1)
                    EndIf
                    GUICtrlSetData($Next, $Current)

                    GUICtrlSetData($Button[3], "Copy")
                    _ButtonControl($GUI_Enable)
                EndIf
            EndIf
        Case $Menu[6]
            ShellExecute($Website)
        Case $Menu[5]
            If BitAND(GUICtrlRead($Menu[5]), $GUI_Checked) = $GUI_Checked Then
                GUICtrlSetState($Menu[5], $GUI_UNChecked)
                IniWrite(@ScriptDir & "\CFBackup.ini", "Settings", "Erase", "NO")
                $Erase = "NO"
            Else
                GUICtrlSetState($Menu[5], $GUI_Checked)
                IniWrite(@ScriptDir & "\CFBackup.ini", "Settings", "Erase", "YES")
                $Erase = "YES"
            EndIf

    EndSwitch
WEnd ;==>

Func _CopyData($sSource, $sDestination, $fReplace = False, $iFlags = 0, $sRoot = '')
    Local $sPath, $sFile, $hSearch, $Percent, $Result, $Size, $State, $Error = -1

    If Not $sRoot Then
        $DirSize = DirGetSize($sSource, 1)
        $CurSize = 0
    EndIf
    $hSearch = FileFindFirstFile($sSource & $sRoot & '\*.*')
    If $hSearch = -1 Then
        Switch @error
            Case 1 ; Folder is empty

            Case Else
                Return SetError(-1, 0, 0)
        EndSwitch
    EndIf
    While 1
        $sFile = FileFindNextFile($hSearch)
        If @error Then
            FileClose($hSearch)
            Return 1
        EndIf

        $sPath = $sRoot & '\' & $sFile

        If @extended Then ; folder
            $sFolderCount = $sFolderCount + 1
            GUICtrlSetData($TotalFolders, $sFolderCount & '/' & $DirSize[2])
            If Not FileExists($sDestination & $sPath) Then
                If Not DirCreate($sDestination & $sPath) Then
                    ExitLoop
                EndIf
                FileSetAttrib($sDestination & $sPath, '+' & StringReplace(FileGetAttrib($sSource & $sPath), 'D', ''))
            EndIf
            If Not _CopyData($sSource, $sDestination, $fReplace, $iFlags, $sPath) Then
                $Error = @error
                ExitLoop
            EndIf
        Else ; file
            GUICtrlSetData($Label, $sFile)
            $sFileCount = $sFileCount + 1
            GUICtrlSetData($TotalFiles, $sFileCount & '/' & $DirSize[1])
            GUICtrlSetData($Progress2, 0)
            $Size = FileGetSize($sSource & $sPath)
            If @error Then
                ExitLoop
            EndIf
            Do
                If (Not $fReplace) And (FileExists($sDestination & $sPath)) Then ; FileExists
                    $Result = MsgBox(35, '', $sDestination & $sPath & ' already exists.' & @CR & @CR & 'Do you want to replace it?', 0, $GUI)
                    Switch $Result
                        Case 2 ; "CANCEL"
                            $Error = 1235 ; ERROR_REQUEST_ABORTED
                            ExitLoop 2
                        Case 7 ; "NO"
                            ExitLoop
                    EndSwitch
                EndIf
                If Not _Copy_CopyFile($sSource & $sPath, $sDestination & $sPath, $iFlags) Then
                    ExitLoop 2
                EndIf
                While 1
                    $Msg2 = GUIGetMsg()
                    If $Msg2 = $GUI_EVENT_CLOSE Then _Terminate()
                    Select
                        Case $Msg2 = $Button[3]
                            $Abort = 1
                            GUICtrlSetData($Progress1, 0)
                            GUICtrlSetData($Progress2, 0)
                        Case $Msg2 = $GUI_EVENT_CLOSE
                            _Terminate()
                        Case $Msg2 = $Menu[4]
                            _Terminate()
                        Case $Msg2 = $Menu[6]
                            ShellExecute($Website)
                    EndSelect
                    If $Abort Then
                        _Copy_Abort()
                        $Abort = False
                    EndIf

                    $State = _Copy_GetState()
                    If $State[0] Then
                        $Percent = Round($State[1] / $Size * 100)
                        If GUICtrlRead($Progress2) <> $Percent Then
                            GUICtrlSetData($Progress2, $Percent)
                        EndIf
                        $Percent = Round(($CurSize + $State[1]) / $DirSize[0] * 100)
                        If GUICtrlRead($Progress1) <> $Percent Then
                            GUICtrlSetData($Progress1, $Percent)
                        EndIf
                    Else
                        If Not $State[2] Then
                            GUICtrlSetData($Progress2, 100)
                        Else
                            $Error = $State[2]
                            ExitLoop 3
                        EndIf
                        ExitLoop 2
                    EndIf
                WEnd
                ;If Not StringInStr(FileGetAttrib($sSource & $sPath), 'A') Then
                ;   FileSetAttrib($sDestination & '\' & $Current & $sPath, '-A')
                ;EndIf
            Until 1
            $CurSize += $Size
            $Percent = Round($CurSize / $DirSize[0] * 100)
            GUICtrlSetData($CurrentSize, Round($CurSize / 1048576, 0) & '/' & Round($DirSize[0] / 1048576, 0))
            If GUICtrlRead($Progress1) <> $Percent Then
                GUICtrlSetData($Progress1, $Percent)
            EndIf
            FileSetAttrib($sDestination & '\' & $Current & $sPath, '+A')
        EndIf
    WEnd
    FileClose($hSearch)
    Return SetError($Error, 0, 0)
EndFunc   ;==>_CopyData

Func _Terminate()
    IniWrite(@ScriptDir & "\CFBackup.ini", "Settings", "Days", GUICtrlRead($Max[1]))
    _Copy_Abort()
    _Copy_CloseDll()
    Exit
EndFunc   ;==>_Terminate

Func _ReduceMemory($i_PID = -1)
    If $i_PID <> -1 Then
        Local $ai_Handle = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1f0fff, 'int', False, 'int', $i_PID)
        Local $ai_Return = DllCall("psapi.dll", 'int', 'EmptyWorkingSet', 'long', $ai_Handle[0])
        DllCall('kernel32.dll', 'int', 'CloseHandle', 'int', $ai_Handle[0])
    Else
        Local $ai_Return = DllCall("psapi.dll", 'int', 'EmptyWorkingSet', 'long', -1)
    EndIf

    Return $ai_Return[0]
EndFunc   ;==>_ReduceMemory

Func _Flush($folder)
    FileSetAttrib($folder & "\*.*", "-RSH", 1)
    Local $search, $file, $attrib
    $search = FileFindFirstFile($folder & "\*.*")
    If $search <> -1 Then
        While 1
            $file = FileFindNextFile($search)
            If @error Then ExitLoop
            $attrib = FileGetAttrib($folder & "\" & $file)
            If StringInStr($attrib, "D") Then
                DirRemove($folder & "\" & $file, 1)
            Else
                FileDelete($folder & "\" & $file)
            EndIf
        WEnd
    EndIf
EndFunc   ;==>_Flush
Edited by Emiel Wieldraaijer

Best regards,Emiel Wieldraaijer

Share this post


Link to post
Share on other sites

#8 ·  Posted (edited)

Share this post


Link to post
Share on other sites

Like leomoon said, awesome script! Yashied

Is there a way to copy folder to folder from multiple path $source that is combine into an array list.

ex.

$arrayItem01 = "C:\1"

$arrayItem02 = "C:\2"

_arrayAdd($sFolders, $arrayItem01)

_arrayAdd($sFolders, $arrayItem02)

sFolders as the source folder. and display the total progress properly.

Thanks in advanced.

Share this post


Link to post
Share on other sites

@wuruoyu

That is not a reasonable UDF request. Write your own wrapper function to utilize this UDF to accomplish your goal.

Share this post


Link to post
Share on other sites

@wraithdu

I see. but forgot to mention. I am asking the UDF maker( Yashied ). Maybe this is too difficult everybody else other than Yashied. :-)

Share this post


Link to post
Share on other sites

@wraithdu

I see. but forgot to mention. I am asking the UDF maker( Yashied ). Maybe this is too difficult everybody else other than Yashied. :-)

No, it's not reasonable for part of the UDF.

The idea of a UDF is to allow developers to write their own wrappers around the functions provided. It's up to you to use Copy.au3 to make it act like you want it to.

Implementing your idea directly into the source would make it act very strictly, stopping Yashied's examples from working how they do and breaking any scripts that rely on it how it works currently.

Your ignorance to this fact makes you even more stupid than not backing away from wraithdu's comment when he fully explained why this would not be done.

Share this post


Link to post
Share on other sites

@yashied

Only work on 32 Bit.

I have a German 64Bit Windows 7 Ultimate OS

$__cpDll = DllOpen($sDll)

If $__cpDll = -1 Then

Return SetError(1, 0, 0)

EndIf

On 64Bit the result $__cpDll is always -1.

XP 32Bit is ok $__cpDll=1

Share this post


Link to post
Share on other sites

#14 ·  Posted (edited)

@paule

I guess the DLL for this UDF is a 32-bit DLL. Just compile your script as a 32-bit executable and you'll be fine. 64-bit executables cannot load 32-bit DLLs and vice-versa.

Edited by wraithdu

Share this post


Link to post
Share on other sites

Another Example based on the recurvice folder copy example from Yashied

#NoTrayIcon
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <UpDownConstants.au3>
#include <EditConstants.au3>
#include "Copy.au3"

If Not _Copy_OpenDll() Then
    MsgBox(16, '', 'Copy.dll not found.')
    Exit
EndIf

Dim $Version = "1.0.0"
Dim $Website = "http://www.autoitscript.com"
Dim $Menu[7], $Button[4], $Progress1, $Progress2, $Percent, $Size, $State, $Copy = 0
Dim $DirSize[3], $DirSizeAfter[4], $Max[4], $CurSize, $Abort = False
Dim $Title = "Copy Folder"

$Source = IniRead(@ScriptDir & "\CFBackup.ini", "Settings", "Source", "")
$Destination = IniRead(@ScriptDir & "\CFBackup.ini", "Settings", "Destination", "")
$Days = IniRead(@ScriptDir & "\CFBackup.ini", "Settings", "Days", "7")
$Current = IniRead(@ScriptDir & "\CFBackup.ini", "Settings", "Current", "")
$Erase = IniRead(@ScriptDir & "\CFBackup.ini", "Settings", "Erase", "NO")

$GUI = GUICreate($Title, 440, 390)

$Menu[1] = GUICtrlCreateMenu("&File")
$Menu[4] = GUICtrlCreateMenuItem("E&xit", $Menu[1])
$Menu[2] = GUICtrlCreateMenu("Options")
$Menu[5] = GUICtrlCreateMenuItem("&Erase folder ", $Menu[2])
$Menu[3] = GUICtrlCreateMenu("&?")
$Menu[6] = GUICtrlCreateMenuItem("Website &AutoItScripts", $Menu[3])

If $Erase = "YES" Then GUICtrlSetState($Menu[5], $GUI_Checked)

GUICtrlCreateGroup("Source : ", 10, 20, 415, 55)
$SourceInput = GUICtrlCreateInput("", 20, 40, 365, 20)
GUICtrlSetState(-1, $GUI_Disable)
GUICtrlSetData(-1, $Source)
$Button[1] = GUICtrlCreateButton("...", 395, 40, 20, 20)
GUICtrlSetTip(-1, "Select source folder", "", 0, 2)

GUICtrlCreateGroup("Target : ", 10, 80, 415, 55)
$DestinationInput = GUICtrlCreateInput("", 20, 100, 365, 20)
GUICtrlSetState(-1, $GUI_Disable)
GUICtrlSetData(-1, $Destination)

$Button[2] = GUICtrlCreateButton("...", 395, 100, 20, 20)
GUICtrlSetTip(-1, "Select target folder", "", 0, 2)

GUICtrlCreateGroup("Status : ", 10, 140, 415, 175)

GUICtrlCreateLabel("File...........................", 20, 160, 95, 20)
$Label = GUICtrlCreateInput("", 120, 158, 295, 20)
GUICtrlSetState(-1, $GUI_Disable)

GUICtrlCreateLabel("Current...............................", 20, 180, 95, 20)
$Progress2 = GUICtrlCreateProgress(120, 178, 295, 20)

GUICtrlCreateLabel("Total.............................", 20, 200, 95, 20)
$Progress1 = GUICtrlCreateProgress(120, 198, 295, 20)

GUICtrlCreateLabel("Files..........................", 20, 240, 95, 20)
$TotalFiles = GUICtrlCreateInput("", 120, 238, 110, 20, $SS_RIGHT)
GUICtrlSetState(-1, $GUI_Disable)

GUICtrlCreateLabel("Folders..........................", 20, 260, 95, 20)
$TotalFolders = GUICtrlCreateInput("", 120, 258, 110, 20, $SS_RIGHT)
GUICtrlSetState(-1, $GUI_Disable)

GUICtrlCreateLabel("Size(MB)...................", 20, 280, 95, 20)
$CurrentSize = GUICtrlCreateInput("", 120, 278, 110, 20, $SS_RIGHT)
GUICtrlSetState(-1, $GUI_Disable)

$Last2 = GUICtrlCreateLabel("Last................................", 240, 240, 100, 20)
GUICtrlSetTip(-1, "Last subfolder used for Backup", "", 0, 2)

$Last = GUICtrlCreateInput("-", 345, 238, 70, 20, $SS_RIGHT)
If $Current = "" Then
    $Current = 1
ElseIf $Current = 1 Then
    GUICtrlSetData($Last, $Days)
Else
    GUICtrlSetData($Last, $Current - 1)
EndIf
GUICtrlSetState(-1, $GUI_Disable)

$Next2 = GUICtrlCreateLabel("Next...........................", 240, 260, 100, 20)
GUICtrlSetTip(-1, "Next subfolder used for Backup", "", 0, 2)
$Next = GUICtrlCreateInput($Current, 345, 258, 70, 20, $SS_RIGHT)
GUICtrlSetState(-1, $GUI_Disable)

$Max[1] = GUICtrlCreateInput($Days, 345, 278, 70, 20, $ES_READONLY + $SS_RIGHT)
$Max[2] = GUICtrlCreateLabel("Maximum........................", 240, 280, 100, 20)
GUICtrlSetTip(-1, "Maximum subfolders used for Backup", "", 0, 2)
$Max[3] = GUICtrlCreateUpdown($Max[1], 0x21)
GUICtrlSetLimit(-1, 999, 2)

$Button[3] = GUICtrlCreateButton("Copy", 340, 330, 80, 20)
GUICtrlSetState(-1, $GUI_DEFBUTTON)

GUISetState()

_ReduceMemory()

Func _ButtonControl($Value)
    For $i = 1 To 3
        GUICtrlSetState($Button[$i], $Value)
    Next
EndFunc   ;==>_ButtonControl

While 1
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then _Terminate()
    Switch $msg
        Case -100 To 0
            ContinueLoop
        Case $msg = $GUI_EVENT_CLOSE
            _Terminate()
        Case $msg = $Menu[4]
            _Terminate()
        Case $Button[1]
            $FolderSelect = FileSelectFolder("Select source folder", "", 3, GUICtrlRead($SourceInput))
            If $FolderSelect <> "" Then
                GUICtrlSetData($SourceInput, $FolderSelect)
                IniWrite(@ScriptDir & "\CFBackup.ini", "Settings", "Source", $FolderSelect)
                $FolderInfo = DirGetSize($FolderSelect)
            EndIf
        Case $Button[2]
            $FolderSelect = FileSelectFolder("Select target folder", "", 3, GUICtrlRead($DestinationInput))
            If $FolderSelect <> "" Then
                GUICtrlSetData($DestinationInput, $FolderSelect)
                IniWrite(@ScriptDir & "\CFBackup.ini", "Settings", "Destination", $FolderSelect)
            EndIf
        Case $Button[3]
            If GUICtrlRead($Button[3]) = "Abort" Then
                $Abort = 1
                GUICtrlSetData($Button[3], "Copy")
            Else
                IniWrite(@ScriptDir & "\CFBackup.ini", "Settings", "Days", GUICtrlRead($Max[1]))
                If GUICtrlRead($SourceInput) = "" Or GUICtrlRead($DestinationInput) = "" Then
                    _ButtonControl($GUI_Disable)
                    MsgBox(16, '', 'The source and destination must be specified.', 0, $GUI)
                    _ButtonControl($GUI_Enable)
                ElseIf GUICtrlRead($SourceInput) = GUICtrlRead($DestinationInput) Then
                    _ButtonControl($GUI_Disable)
                    MsgBox(16, '', 'The source and destination must be different.', 0, $GUI)
                    _ButtonControl($GUI_Enable)
                Else
                    GUICtrlSetData($Progress1, 0)
                    GUICtrlSetData($Button[3], "Abort")
                    GUICtrlSetState($Button[1], $GUI_Disable)
                    GUICtrlSetState($Button[2], $GUI_Disable)
                    GUICtrlSetData($Next2, "Current............................")
                    GUICtrlSetTip($Next2, "Current subfolder used for Backup", "", 0, 2)

                    If $Erase = "YES" Then _Flush(GUICtrlRead($DestinationInput) & '\' & $Current)

                    $TimeStart = TimerInit()
                    $sFileCount = 0
                    $sFolderCount = 0
                    _CopyData(GUICtrlRead($SourceInput), GUICtrlRead($DestinationInput) & '\' & $Current, True)
                    Switch @error
                        Case 0
                            $TimeEnd = Round(TimerDiff($TimeStart) / 1000)
                            $DirSizeAfter = DirGetSize(GUICtrlRead($DestinationInput) & '\' & $Current, 1)
                            GUICtrlSetState($Button[3], $GUI_Disable)
                            MsgBox(64, '', 'Copied ' & $DirSizeAfter[1] & ' files successfully in ' & $TimeEnd & ' Seconds.', 0, $GUI)
                        Case 1235 ; ERROR_REQUEST_ABORTED
                            $TimeEnd = Round(TimerDiff($TimeStart) / 1000)
                            GUICtrlSetState($Button[3], $GUI_Disable)
                            MsgBox(16, '', 'Copy was aborted by user.', 0, $GUI)
                        Case Else
                            $TimeEnd = Round(TimerDiff($TimeStart) / 1000)
                            GUICtrlSetState($Button[3], $GUI_Disable)
                            MsgBox(16, '', 'No files were copied. ' & @CR & @CR & @error, 0, $GUI)
                    EndSwitch
                    GUICtrlSetData($Next2, "Next...............")
                    GUICtrlSetTip(-1, "Next subfolder used for Backup", "", 0, 2)
                    $Current = $Current + 1
                    If $Current > $Days Then $Current = 1
                    IniWrite(@ScriptDir & "\CFBackup.ini", "Settings", "Current", $Current)

                    If $Current - 1 = 0 Then
                        GUICtrlSetData($Last, $Days)
                    Else
                        GUICtrlSetData($Last, $Current - 1)
                    EndIf
                    GUICtrlSetData($Next, $Current)

                    GUICtrlSetData($Button[3], "Copy")
                    _ButtonControl($GUI_Enable)
                EndIf
            EndIf
        Case $Menu[6]
            ShellExecute($Website)
        Case $Menu[5]
            If BitAND(GUICtrlRead($Menu[5]), $GUI_Checked) = $GUI_Checked Then
                GUICtrlSetState($Menu[5], $GUI_UNChecked)
                IniWrite(@ScriptDir & "\CFBackup.ini", "Settings", "Erase", "NO")
                $Erase = "NO"
            Else
                GUICtrlSetState($Menu[5], $GUI_Checked)
                IniWrite(@ScriptDir & "\CFBackup.ini", "Settings", "Erase", "YES")
                $Erase = "YES"
            EndIf

    EndSwitch
WEnd ;==>

Func _CopyData($sSource, $sDestination, $fReplace = False, $iFlags = 0, $sRoot = '')
    Local $sPath, $sFile, $hSearch, $Percent, $Result, $Size, $State, $Error = -1

    If Not $sRoot Then
        $DirSize = DirGetSize($sSource, 1)
        $CurSize = 0
    EndIf
    $hSearch = FileFindFirstFile($sSource & $sRoot & '\*.*')
    If $hSearch = -1 Then
        Switch @error
            Case 1 ; Folder is empty

            Case Else
                Return SetError(-1, 0, 0)
        EndSwitch
    EndIf
    While 1
        $sFile = FileFindNextFile($hSearch)
        If @error Then
            FileClose($hSearch)
            Return 1
        EndIf

        $sPath = $sRoot & '\' & $sFile

        If @extended Then ; folder
            $sFolderCount = $sFolderCount + 1
            GUICtrlSetData($TotalFolders, $sFolderCount & '/' & $DirSize[2])
            If Not FileExists($sDestination & $sPath) Then
                If Not DirCreate($sDestination & $sPath) Then
                    ExitLoop
                EndIf
                FileSetAttrib($sDestination & $sPath, '+' & StringReplace(FileGetAttrib($sSource & $sPath), 'D', ''))
            EndIf
            If Not _CopyData($sSource, $sDestination, $fReplace, $iFlags, $sPath) Then
                $Error = @error
                ExitLoop
            EndIf
        Else ; file
            GUICtrlSetData($Label, $sFile)
            $sFileCount = $sFileCount + 1
            GUICtrlSetData($TotalFiles, $sFileCount & '/' & $DirSize[1])
            GUICtrlSetData($Progress2, 0)
            $Size = FileGetSize($sSource & $sPath)
            If @error Then
                ExitLoop
            EndIf
            Do
                If (Not $fReplace) And (FileExists($sDestination & $sPath)) Then ; FileExists
                    $Result = MsgBox(35, '', $sDestination & $sPath & ' already exists.' & @CR & @CR & 'Do you want to replace it?', 0, $GUI)
                    Switch $Result
                        Case 2 ; "CANCEL"
                            $Error = 1235 ; ERROR_REQUEST_ABORTED
                            ExitLoop 2
                        Case 7 ; "NO"
                            ExitLoop
                    EndSwitch
                EndIf
                If Not _Copy_CopyFile($sSource & $sPath, $sDestination & $sPath, $iFlags) Then
                    ExitLoop 2
                EndIf
                While 1
                    $Msg2 = GUIGetMsg()
                    If $Msg2 = $GUI_EVENT_CLOSE Then _Terminate()
                    Select
                        Case $Msg2 = $Button[3]
                            $Abort = 1
                            GUICtrlSetData($Progress1, 0)
                            GUICtrlSetData($Progress2, 0)
                        Case $Msg2 = $GUI_EVENT_CLOSE
                            _Terminate()
                        Case $Msg2 = $Menu[4]
                            _Terminate()
                        Case $Msg2 = $Menu[6]
                            ShellExecute($Website)
                    EndSelect
                    If $Abort Then
                        _Copy_Abort()
                        $Abort = False
                    EndIf

                    $State = _Copy_GetState()
                    If $State[0] Then
                        $Percent = Round($State[1] / $Size * 100)
                        If GUICtrlRead($Progress2) <> $Percent Then
                            GUICtrlSetData($Progress2, $Percent)
                        EndIf
                        $Percent = Round(($CurSize + $State[1]) / $DirSize[0] * 100)
                        If GUICtrlRead($Progress1) <> $Percent Then
                            GUICtrlSetData($Progress1, $Percent)
                        EndIf
                    Else
                        If Not $State[2] Then
                            GUICtrlSetData($Progress2, 100)
                        Else
                            $Error = $State[2]
                            ExitLoop 3
                        EndIf
                        ExitLoop 2
                    EndIf
                WEnd
                ;If Not StringInStr(FileGetAttrib($sSource & $sPath), 'A') Then
                ;   FileSetAttrib($sDestination & '\' & $Current & $sPath, '-A')
                ;EndIf
            Until 1
            $CurSize += $Size
            $Percent = Round($CurSize / $DirSize[0] * 100)
            GUICtrlSetData($CurrentSize, Round($CurSize / 1048576, 0) & '/' & Round($DirSize[0] / 1048576, 0))
            If GUICtrlRead($Progress1) <> $Percent Then
                GUICtrlSetData($Progress1, $Percent)
            EndIf
            FileSetAttrib($sDestination & '\' & $Current & $sPath, '+A')
        EndIf
    WEnd
    FileClose($hSearch)
    Return SetError($Error, 0, 0)
EndFunc   ;==>_CopyData

Func _Terminate()
    IniWrite(@ScriptDir & "\CFBackup.ini", "Settings", "Days", GUICtrlRead($Max[1]))
    _Copy_Abort()
    _Copy_CloseDll()
    Exit
EndFunc   ;==>_Terminate

Func _ReduceMemory($i_PID = -1)
    If $i_PID <> -1 Then
        Local $ai_Handle = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1f0fff, 'int', False, 'int', $i_PID)
        Local $ai_Return = DllCall("psapi.dll", 'int', 'EmptyWorkingSet', 'long', $ai_Handle[0])
        DllCall('kernel32.dll', 'int', 'CloseHandle', 'int', $ai_Handle[0])
    Else
        Local $ai_Return = DllCall("psapi.dll", 'int', 'EmptyWorkingSet', 'long', -1)
    EndIf

    Return $ai_Return[0]
EndFunc   ;==>_ReduceMemory

Func _Flush($folder)
    FileSetAttrib($folder & "\*.*", "-RSH", 1)
    Local $search, $file, $attrib
    $search = FileFindFirstFile($folder & "\*.*")
    If $search <> -1 Then
        While 1
            $file = FileFindNextFile($search)
            If @error Then ExitLoop
            $attrib = FileGetAttrib($folder & "\" & $file)
            If StringInStr($attrib, "D") Then
                DirRemove($folder & "\" & $file, 1)
            Else
                FileDelete($folder & "\" & $file)
            EndIf
        WEnd
    EndIf
EndFunc   ;==>_Flush

You're example doesn't work at home (XP PRO SP3, AutoIt v3.3.6.1) "No files were copied".

The source folder contains 5 files and the target folder is empty.

What did I miss?

1 person likes this

[list][*]AutoIt 3.3.8.1[*]Win XP PRO SP3[/list]

Share this post


Link to post
Share on other sites

The short bus maybe? How is anyone supposed to try to help you when you've provided absolutely no information that is even slightly useful?

Share this post


Link to post
Share on other sites

The short bus maybe? How is anyone supposed to try to help you when you've provided absolutely no information that is even slightly useful?

Sorry, I'm a noob and I don't know yet what I can say more about it. But, it would be helpful if I was just told the script I mention above works for someone or not.

Cheers :graduated:


[list][*]AutoIt 3.3.8.1[*]Win XP PRO SP3[/list]

Share this post


Link to post
Share on other sites

#18 ·  Posted (edited)

wow, cannot believe some people here are very impatient, rarher than write 100 words to express your own point of view. for honest people would just say i dont know or a good programmer would instead posting something more useful to help people on this forum. isn't that the whole point. and thanks you. i solved my array problem. :-)

Edited by wuruoyu

Share this post


Link to post
Share on other sites

#19 ·  Posted (edited)

Why don't you save your own 100 words and come up with a solution to your own problem? This forum is about helping people, not spoon feeding them some code they wouldn't understand anyway. Most of the people commenting in this thread are more than capable of solving your problem in 10 minutes. But it's your problem. What would you learn if we did it for you? If you've solved your problem already, then great, hopefully you've learned something along the way. Otherwise post something that shows you've at least put in some effort and you're more likely to get a helpful response.

@freMea

Odds are if the example was posted, then it at least works for him. If you're so much a noob that you are unable to provide relevant information regarding your errors, then maybe you're not ready for this UDF. Just saying...

... and yes, I'm impatient today.

Edited by wraithdu

Share this post


Link to post
Share on other sites

#20 ·  Posted (edited)

Share this post


Link to post
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