Что нового

Копируем файлы без "тормозов"

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712
AutoIt: 3.3.6.1
Версия: 1.4

Категория: Файловая система, Процессы

Описание: Эта небольшая библиотека позволяет простым и надежным способом копировать файлы без "подвешивания" скрипта. Помимо этого, можно получать текущее состояние (количество скопированных байт) в процессе копирования. Работа с этой UDF аналогична работе с функцией InetGet().

Файл(ы): Copy.zip

Пример1 (копирование одного файла):
Код:
#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()

Пример2 (копирование нескольких файлов одновременно):
Код:
#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()

Пример3 (GUI, копирование файлов):
Код:
#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(52, '', $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

Пример4 (GUI, копирование папок):
Код:
#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(52, '', $Path & ' 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($Label, 'Preparing...')
                GUICtrlSetData($Button3, 'Abort')
                _Copy_CopyDir($Source, $Path)
                $Copy = 1
            EndIf
        Case $Button4
            $Pause = Not $Pause
            If $Pause Then
                GUICtrlSetData($Button4, '4')
            Else
                GUICtrlSetData($Button4, ';')
            EndIf
            _Copy_Pause($Pause)
    EndSwitch
WEnd

Скриншот:


Источник: Copy UDF (оффициальный форум)
Автор: Yashied
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
а папки копировать умеет? :smile:
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712
Kaster сказал(а):
а папки копировать умеет?
Не умеет. Это тривиальная задача, и каждый может самостоятельно это написать.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Yashied [?]
каждый может самостоятельно это написать
темы на форуме говорят об обратном :whistle:
но на самом деле я тупанул, почему то показалось что это программа. а это UDF.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 402
Yashied [?]
Работа с этой UDF аналогична работе с функцией InetGet(). Одновременно можно копировать только один файл.
Вообще то InetGet уже позволяет качать одновременно более одного файла.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712
CreatoR сказал(а):
Вообще то InetGet уже позволяет качать одновременно более одного файла.
Я не в смысле количества одновременно копируемых файлов, а в принципе работы в целом.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712
Обновил библиотеку: добавил функцию _Copy_MoveFile().
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712
Обновил библиотеку (версия 1.2). Теперь можно копировать/перемещать несколько (до 256 :smile:) файлов одновременно без какого-либо влияния на выполнение скрипта. Технически, все делает Copy.dll, а Copy UDF лишь его обертка для простоты использования в AutoIt. Кому интересно, вот код Copy.dll, написанный на PB 4.50:

Код:
Global Kernel.l = OpenLibrary(#PB_Any, "kernel32.dll")

Structure Parameters
	*Source
	*Destination
	*Proc
	*Ptr
	*Cancel
	Flags.l
EndStructure

Structure Result
	TotalBytesTransferred.q
	Abort.l
	SystemErrorCode.l
	Progress.l
EndStructure

Procedure.l CopyProgressRoutine(TotalFileSize.q, TotalBytesTransferred.q, StreamSize.q, StreamBytesTransferred.q, StreamNumber.l, CallbackReason.l, *SourceFile, *DestinationFile, *Param.Result)
	*Param\TotalBytesTransferred = TotalBytesTransferred
	If *Param\Abort
		ProcedureReturn 1 ; PROGRESS_CANCEL
	Else
		ProcedureReturn 0 ; PROGRESS_CONTINUE
	EndIf
EndProcedure

Procedure Copy(*Param.Parameters)
	If Not CallFunction(Kernel, "CopyFileExW", *Param\Source, *Param\Destination, *Param\Proc, *Param\Ptr, *Param\Cancel, *Param\Flags)
		PokeL(*Param\Ptr + 12, CallFunction(Kernel, "GetLastError"))
	EndIf
	PokeL(*Param\Ptr + 16, 0)
	FreeMemory(*Param\Source)
	FreeMemory(*Param\Destination)
	FreeMemory(*Param)
EndProcedure

Procedure Move(*Param.Parameters)
	If Not CallFunction(Kernel, "MoveFileWithProgressW", *Param\Source, *Param\Destination, *Param\Proc, *Param\Ptr, *Param\Flags)
		PokeL(*Param\Ptr + 12, CallFunction(Kernel, "GetLastError"))
	EndIf
	PokeL(*Param\Ptr + 16, 0)
	FreeMemory(*Param\Source)
	FreeMemory(*Param\Destination)
	FreeMemory(*Param)
EndProcedure

Procedure.l CopyMoveFileProgress(*Source, *Destination, Flags.l, *Ptr.Result, Action.l)
	If Not Kernel
		ProcedureReturn 0
	EndIf
	SourceLen.l = 2 * (CallFunction(Kernel, "lstrlenW", *Source) + 1)
	DestinationLen.l = 2 * (CallFunction(Kernel, "lstrlenW", *Destination) + 1)
	*Param.Parameters = AllocateMemory(SizeOf(Parameters))
	*Param\Source = AllocateMemory(SourceLen)
	*Param\Destination = AllocateMemory(DestinationLen)
	*Param\Ptr = *Ptr
	*Param\Cancel = 0
	*Param\Flags = Flags
	*Param\Proc = @CopyProgressRoutine()
	*Ptr\TotalBytesTransferred = 0
	*Ptr\Abort = 0
	*Ptr\SystemErrorCode = 0
	*Ptr\Progress = 1
	CopyMemory(*Source, *Param\Source, SourceLen)
	CopyMemory(*Destination, *Param\Destination, DestinationLen)
	If Not Action
		Result = CreateThread(@Copy(), *Param)
	Else
		Result = CreateThread(@Move(), *Param)
	EndIf
	If Not Result
		*Ptr\SystemErrorCode = -1
		*Ptr\Progress = 0
		FreeMemory(*Param\Source)
		FreeMemory(*Param\Destination)
		FreeMemory(*Param)
		ProcedureReturn 0
	Else
		ProcedureReturn 1
	EndIf
EndProcedure

ProcedureDLL.l CopyFileProgressW(*Source, *Destination, Flags.l, *Ptr.Result)
	ProcedureReturn CopyMoveFileProgress(*Source, *Destination, Flags.l, *Ptr.Result, 0)
EndProcedure

ProcedureDLL.l MoveFileProgressW(*Source, *Destination, Flags.l, *Ptr.Result)
	ProcedureReturn CopyMoveFileProgress(*Source, *Destination, Flags.l, *Ptr.Result, 1)
EndProcedure
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Yashied
а не многовато 256? скорость диска все равно является узким местом, обычно параллельная обработка 2-3 файлов за глаза.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712
Kaster сказал(а):
Yashied
а не многовато 256? скорость диска все равно является узким местом, обычно параллельная обработка 2-3 файлов за глаза.
Вот и я подумал, что 4294967296 (DWORD) одновременно копируемых файлов, это немного перебор :smile:, и сделал 256. Это просто теоретический предел, для UDF, количество не имеет значения, все выполняет API.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712
Добавил еще один пример на рекурсивное копирование папок (см. первый пост).
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712
Обновил библиотеку. Добавлена поддержка x64 (Copy_x64.dll).
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Yashied,
Решил воспользоваться Вашей библиотекой Copy.au3 для множественного перемещения(копирования) файлов в этой теме: Умная автозамена при перемещении.
К сожалению (моему), уровень моих знаний PB 4.50 никогда не поднимался выше 0 и в исходнике Copy.dll я ничего не понял.
Скажите, пожалуйста, я правильно понял назначение параметров в функциях _Copy_CopyFile() и _Copy_MoveFile()?
$sSource - файл-источник;
$sDestination - файл-назначение;
$iFlags - 0 перезаписывать имеющиеся файлы;
1 не перезаписывать имеющиеся файлы;
$iID - индекс функции для отображения прогресса выполнения.

И еще один вопрос. Что задает параметр $iIndex в функции _Copy_GetState()?
Спасибо.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712
Сегодня я выложу версию 1.3 этой библиотеки. Там уже можно будет копировать не только файлы, но и папки целиком. Также будет описание ко всем функциям (на английском) и еще несколько дополнительных функций.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Kaster [?]
а папки копировать умеет?
Yashied [?]
Не умеет. Это тривиальная задача, и каждый может самостоятельно это написать.
[?]
Там уже можно будет копировать не только файлы, но и папки целиком.
:sorcerer: :thumbs_up:
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712
Обновил библиотеку до версии 1.3.

Список изменений:
  • Добавлена возможность копировать и перемещать каталоги, включая все их подкаталоги и файлы.
  • Добавлена возможность приостановить и возобновить процессы копирования и перемещения.
  • Функция _Copy_GetState() теперь возвращает более подробную информацию о состоянии копирования и перемещения файлов.
  • Добавлено описание ко всем функциям библиотеки.
  • Обновлены примеры.

Еще раз напомню, что весь процесс копирования и перемещения файлов происходит с помощью функций CopyFileEx() и MoveFileWithProgress() соответственно. Другими словами, это именно то, что делает сама система, когда вы копируете файлы в Explorer'е. Соответственно и скорость копирования файлов с помощью данной библиотеки соизмерима со скоростью копирования в Windows, а в Windows 7 у меня получается даже быстрее.

:smile:
 

glax24

Знающий
Сообщения
72
Репутация
14
Yashied
Не подскажите как скомпилировать программу чтобы не требовалась библиотека. Был только один exe.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712
glax24 сказал(а):
Не подскажите как скомпилировать программу чтобы не требовалась библиотека. Был только один exe.
Без Copy.dll никак. Ну, если только FileInstall()...
 

glax24

Знающий
Сообщения
72
Репутация
14
Заметил следующую особенность подскажите как исправить.
Сделал копирование в отдельную функцию
Код:
Func Copy_Dir($Source, $Destination)
    If $Copy Then
                _Copy_Abort()
            Else
                If (Not $Source) Or (Not $Destination) Then
                    MsgBox(16, '', 'Источник и папки назначения должны быть определены.', 0, $Form1)
                    Return -1
                EndIf
                $Path = $Destination & '\' & StringRegExpReplace($Source, '^.*\\', '')
                If FileExists($Path) Then
                    If MsgBox(52, '', $Destination & ' уже существует.' & @CR & @CR & 'Заменить?', 0, $Form1) <> 6 Then
                        Return -1
						;ContinueLoop
                    EndIf
                EndIf
               GUICtrlSetState($Button_Start, $GUI_DISABLE)
               GUICtrlSetData($Label, 'Preparing...')
              _Copy_CopyDir($Source, $Destination)
                $Copy = 1
            EndIf
EndFunc ; ===>Copy_Dir()

а
Код:
While 1
;-----copy----
	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, $Form1)
                Case 1235 ; ERROR_REQUEST_ABORTED
                    MsgBox(16, '', 'Folder copying was aborted.', 0, $Form1)
                Case Else
                    MsgBox(16, '', 'Folder was not copied.' & @CR & @CR & $State[5], 0, $Form1)
            EndSwitch
              GUICtrlSetData($Progress, 0)
            GUICtrlSetData($Label, '')
			GUICtrlSetState($Button_Start, $GUI_ENABLE)
            GUICtrlSetData($Button_Start, 'Старт')
            $Copy = 0
        EndIf
    EndIf
;----end copy-----
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button_Start
Copy_Dir($Source1,$Destination1)
Copy_Dir($Source2,$Destination2)		
EndSwitch
WEnd

При следующей реализации появляется ошибка MsgBox(16, '', 'Folder copying was aborted.', 0, $Form1)
Если по кнопке $Button_Start вызывать только один раз Copy_Dir($Source1,$Destination1) то все работает. А мне надо сразу копировать несколько разных каталогов.
 
Верх