#include <FileOperations.au3>
#include <File.au3>
#include <array.au3>
Dim $array[1][2]
$array[0][0] = 'Путь к папке или файлу'
$array[0][1] = 'Папка назначения'
;массив должен быть только двумерным. с любым количеством строк - $array[$n][2]
$MainWin = GUICreate('_CopyDirCopyFile', 500, 128, -1, -1)
$Progress = GUICtrlCreateProgress(24, 32, 450, 17)
$BtStart = GUICtrlCreateButton("Старт", 40, 60, 75, 25)
$BtPause = GUICtrlCreateButton("Пауза", 136, 60, 75, 25)
$BtExit = GUICtrlCreateButton('Стоп', 230, 60, 75, 25)
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case -3
Exit
Case $BtStart
;$Source = FileSelectFolder('', '', 1 + 2 + 4, '', $MainWin)
;$Source = FileOpenDialog('', '', '(*.*)', 1 + 4, '', $MainWin)
;$Dest = FileSelectFolder('', '', 1 + 2 + 4, '', $MainWin);
;$Dest = FileSaveDialog('', '', '(*.*)', 16, '', $MainWin);
$ret = _CopyDirCopyFile($array, '', 1, 1, 1, $Progress, $BtExit, $BtPause); данные для копирования берутся из массива
;$ret = _CopyDirCopyFile($Source, $Dest, 0, 1, 1, $Progress, $BtExit, $BtPause); исходный путь и путь назначения получаются не из массива. функциями открытия файла или выбора папки.
ConsoleWrite($ret & @CRLF)
EndSwitch
WEnd
; Функция ====================================================================================================
; Имя.................: _CopyDirCopyFile
; Синтаксис...........: _CopyDirCopyFile($FileSource, $FileDest, $CopyArray = 0, $FolderCopy = 1, $FileCopy = 1, $ProgressBar = '', $ButtonFuncStop = '', $ButtonPauseFunc = '')
; Назначение..........: Копирование файлов и папок, отображение процесса копирования в элементе, созданном функцией GUICtrlCreateProgress
; Параметры...........: $FileSource - Копируемые файлы или папки (возможен выбор нескольких файлов)
; $FileDest - Путь копирования.При использовании массива оставить пустое значение - ""
; |$CopyArray = 0 (по умолчанию) - исходный путь и путь назначения не массив
; |$CopyArray = 1 - исходный путь и путь назначения массив
; |$FolderCopy = 1 (по умолчанию) - Если в месте назначения есть папка с таким же именем, то она будет перезаписана.
; |$FolderCopy = 0 - Если в месте назначения есть папка с таким же именем, то у копируемой папки будет изменено имя
; |$FileCopy = 1 (по умолчанию) - Файлы со сходными именами в месте назначения будут перезаписаны
; |$FileCopy = 0 - будут созданы копии файлов, имена которых совпадают
; |$ProgressBar = '' (по умолчанию) - Переменная элемента, созданного функцией GUICtrlCreateProgress
; |$ButtonFuncStop = '' (по умолчанию) - Переменная элемента (кнопки) для остановки функции
; |$ButtonPauseFunc = '' (по умолчанию) - Переменная элемента (кнопки) для паузы функции
;Возвращаемые значения: 0 - успешное выполнение
; 1 - исходный путь не существует
; 2 - путь назначения не существует
; 3 - $FileSource не является массивом или это не двумерный массив
; 4 - файлы или папки не скопированы, неверен путь\не найдены файлы или нет прав на чтение\запись
; 5 - некоторые файлы не скопированы
; 6 - остановка функции пользователем
; =============================================================================================================
Func _CopyDirCopyFile($FileSource, $FileDest, $CopyArray = 0, $FolderCopy = 1, $FileCopy = 1, $ProgressBar = '', $ButtonFuncStop = '', $ButtonPauseFunc = '')
Global $ButtonStop = $ButtonFuncStop, $ButtonPause = $ButtonPauseFunc, $ExitFunc = 0, $Pause = 0
Local $s = 4096, $a = 1, $b = 1, $size_all = 0, $flag = 0, $guimsg = 0, $result
Local $filesearchsizeall = 0, $filesize = 0, $filesize_all = 0, $z = 0, $x = 0, $y = 0, $p = 0, $null = 0
If Not $ButtonFuncStop = '' And Not $ButtonPauseFunc = '' Then
GUIRegisterMsg(0x0111, 'WM_COMMAND_Copy_Gui')
Local $DataButtonPause = GUICtrlRead($ButtonPauseFunc)
$guimsg = 1
ElseIf Not $ButtonFuncStop = '' Then
GUIRegisterMsg(0x0111, 'WM_COMMAND_Copy_Gui')
$guimsg = 1
ElseIf Not $ButtonPauseFunc = '' Then
GUIRegisterMsg(0x0111, 'WM_COMMAND_Copy_Gui')
Local $DataButtonPause = GUICtrlRead($ButtonPauseFunc)
$guimsg = 1
EndIf
Select
Case $CopyArray = 0
Dim $ArrayFileCopy[1][2]
$ArrayFileCopy[0][0] = $FileSource
$ArrayFileCopy[0][1] = $FileDest
If $ArrayFileCopy[0][0] = '' Then Return 1
If $ArrayFileCopy[0][1] = '' Then Return 2
Case $CopyArray = 1
If UBound($FileSource, 0) = 2 Then
Dim $ArrayFileCopy[UBound($FileSource)][2]
For $i = 0 To UBound($FileSource) - 1
$ArrayFileCopy[$i][0] = $FileSource[$i][0]
$ArrayFileCopy[$i][1] = $FileSource[$i][1]
Next
Else
Return 3
EndIf
For $i = 0 To UBound($ArrayFileCopy) - 1
If $ArrayFileCopy[$i][0] = '' Or $ArrayFileCopy[$i][1] = '' Then ContinueLoop
$filesearch = _FO_FileSearch($ArrayFileCopy[$i][0], '*', True, 125, 1, 2)
If Not @error Then
For $t = 0 To UBound($filesearch) - 1
$filesearchsize = FileGetSize($filesearch[$t])
$filesearchsizeall += $filesearchsize
Next
Else
$filepathsize = FileGetSize($ArrayFileCopy[$i][0])
$filesize += $filepathsize
EndIf
Next
$filesize_all = $filesearchsizeall + $filesize
$round = Ceiling($filesize_all / $s)
$step = Ceiling($round / 100)
EndSelect
Dim $szDrive, $szDir, $szFName, $szExt, $Drive, $Dir, $FName, $Ext
For $ar = 0 To UBound($ArrayFileCopy) - 1
If $ArrayFileCopy[$ar][0] = '' Or $ArrayFileCopy[$ar][1] = '' Then
$null += 1
ContinueLoop
EndIf
If $Pause = 1 Then
GUICtrlSetData($ButtonPause, 'Proceed')
While 1
If $Pause = 0 Then
GUICtrlSetData($ButtonPause, $DataButtonPause)
ExitLoop
EndIf
If $ExitFunc = 1 Then
GUICtrlSetData($ButtonPause, $DataButtonPause)
ExitLoop
EndIf
Sleep(100)
WEnd
EndIf
If $ExitFunc = 1 Then
GUICtrlSetData($ProgressBar, '')
Return 6
EndIf
$pathcheck = _PathSplit($ArrayFileCopy[$ar][1], $Drive, $Dir, $FName, $Ext)
If $pathcheck[1] = '' Or FileExists($pathcheck[1]) = 0 Then
$y += 1
ContinueLoop
EndIf
$var_string = StringReplace($ArrayFileCopy[$ar][0], "|", '\', 1)
$path = _PathSplit($var_string, $szDrive, $szDir, $szFName, $szExt)
$attrib_fd = FileGetAttrib($ArrayFileCopy[$ar][0])
$fd_s = StringInStr($attrib_fd, 'D')
If Not $fd_s = 0 Then
$flag = 1
$dir_name = StringRegExpReplace($ArrayFileCopy[$ar][0], '.*\\', '')
Select
Case $FolderCopy = 0
If FileExists($ArrayFileCopy[$ar][1] & '\' & $dir_name) Then
$dirname = $ArrayFileCopy[$ar][1] & '\' & $dir_name & '_' & @SEC & @MSEC
$result = _FO_FileSearch($ArrayFileCopy[$ar][0], '*', True, 125, 1, 2)
If @error Then
$dircopy = DirCopy($ArrayFileCopy[$ar][0], $dirname)
ContinueLoop
If $dircopy = 0 Then
$y += 1
ContinueLoop
EndIf
EndIf
Else
$dirname = $ArrayFileCopy[$ar][1] & '\' & $dir_name
$result = _FO_FileSearch($ArrayFileCopy[$ar][0], '*', True, 125, 1, 2)
If @error Then
$dircopy = DirCopy($ArrayFileCopy[$ar][0], $dirname)
ContinueLoop
If $dircopy = 0 Then
$y += 1
ContinueLoop
EndIf
EndIf
EndIf
Case $FolderCopy = 1
$dirname = $ArrayFileCopy[$ar][1] & '\' & $dir_name
$result = _FO_FileSearch($ArrayFileCopy[$ar][0], '*', True, 125, 1, 2)
If @error Then
$replacepath = StringReplace($path[1] & $path[2], '\', '', -1)
$compare = StringCompare($ArrayFileCopy[$ar][1], $replacepath)
If $compare = 0 Then
$y += 1
ContinueLoop
Else
$dircopy = DirCopy($ArrayFileCopy[$ar][0], $dirname, 1)
ContinueLoop
If $dircopy = 0 Then
$y += 1
ContinueLoop
EndIf
EndIf
Else
$replacepath = StringReplace($path[1] & $path[2], '\', '', -1)
$compare = StringCompare($ArrayFileCopy[$ar][1], $replacepath)
If $compare = 0 Then
$y += 1
ContinueLoop
EndIf
EndIf
EndSelect
Else
$flag = 2
Select
Case $CopyArray = 0
$replace = StringReplace($var_string, '|', '*' & $path[1] & $path[2])
$result = StringSplit($replace, '*', 2)
If UBound($result) = 1 Then
If FileExists($result[0]) = 0 Then
$y += 1
ContinueLoop
EndIf
EndIf
For $i = 0 To UBound($result) - 1
$filesize = FileGetSize($result[$i])
$filesize_all += $filesize
Next
$round = Ceiling($filesize_all / $s)
$step = Ceiling($round / 100)
Case $CopyArray = 1
Dim $result[1]
$result[0] = $ArrayFileCopy[$ar][0]
EndSelect
$attrib_f = FileGetAttrib($ArrayFileCopy[$ar][1])
$f_s = StringInStr($attrib_f, 'D')
EndIf
For $r = 0 To UBound($result) - 1
If $Pause = 1 Then
GUICtrlSetData($ButtonPause, 'Proceed')
While 1
If $Pause = 0 Then
GUICtrlSetData($ButtonPause, $DataButtonPause)
ExitLoop
EndIf
If $ExitFunc = 1 Then
GUICtrlSetData($ButtonPause, $DataButtonPause)
ExitLoop
EndIf
Sleep(100)
WEnd
EndIf
If $ExitFunc = 1 Then
GUICtrlSetData($ProgressBar, '')
Return 6
EndIf
Select
Case $flag = 1
Select
Case $FileCopy = 0
If FileExists($dirname & StringReplace($result[$r], $ArrayFileCopy[$ar][0], '', 1)) Then
$filenamestring = StringRegExpReplace($dirname & StringReplace($result[$r], $ArrayFileCopy[$ar][0], '', 1), '.*\\', '')
$pathreplace = StringReplace($dirname & StringReplace($result[$r], $ArrayFileCopy[$ar][0], '', 1), $filenamestring, '', -1)
$filedestname = $pathreplace & @SEC & @MSEC & '_' & $filenamestring
Else
$filedestname = $dirname & StringReplace($result[$r], $ArrayFileCopy[$ar][0], '', 1)
EndIf
Case $FileCopy = 1
$filedestname = $dirname & StringReplace($result[$r], $ArrayFileCopy[$ar][0], '', 1)
If FileExists($filedestname) Then FileSetAttrib($filedestname, '-RSH')
EndSelect
Case $flag = 2
If Not $f_s = 0 Then
Select
Case $FileCopy = 0
If FileExists($ArrayFileCopy[$ar][1] & '\' & StringRegExpReplace($result[$r], '.*\\', '')) Then
$filenamestring = StringRegExpReplace($result[$r], '.*\\', '')
$pathreplace = StringReplace($ArrayFileCopy[$ar][1], $filenamestring, '', -1)
$filedestname = $pathreplace & '\' & @SEC & @MSEC & '_' & $filenamestring
Else
$filedestname = $ArrayFileCopy[$ar][1] & '\' & StringRegExpReplace($result[$r], '.*\\', '')
EndIf
Case $FileCopy = 1
$filedestname = $ArrayFileCopy[$ar][1] & '\' & StringRegExpReplace($result[$r], '.*\\', '')
If FileExists($filedestname) Then FileSetAttrib($filedestname, '-RSH')
EndSelect
Else
Select
Case $CopyArray = 1
$filedestname = $ArrayFileCopy[$ar][1] & '\' & StringRegExpReplace($result[$r], '.*\\', '')
Case $CopyArray = 0
$filedestname = $ArrayFileCopy[$ar][1]
EndSelect
EndIf
EndSelect
$hFile = FileOpen($result[$r], 16)
If $hFile = -1 Then
$z += 1
ContinueLoop
EndIf
$folderdestname = FileOpen($filedestname, 2 + 8 + 16)
If $folderdestname = -1 Then
FileClose($hFile)
$x += 1
ContinueLoop
EndIf
While 1
If $Pause = 1 Then
GUICtrlSetData($ButtonPause, 'Proceed')
While 1
If $Pause = 0 Then
GUICtrlSetData($ButtonPause, $DataButtonPause)
ExitLoop
EndIf
If $ExitFunc = 1 Then
GUICtrlSetData($ButtonPause, $DataButtonPause)
ExitLoop
EndIf
Sleep(100)
WEnd
EndIf
If $ExitFunc = 1 Then
GUICtrlSetData($ProgressBar, '')
FileClose($hFile)
FileClose($folderdestname)
FileDelete($filedestname)
Return 6
EndIf
$sChars = FileRead($hFile, $s)
If @error = -1 Then
ExitLoop
ElseIf @error = 1 Then
$z += 1
ExitLoop
EndIf
$file_w = FileWrite($folderdestname, $sChars)
If $file_w = 0 Then
$x += 1
ExitLoop
EndIf
If $b = $step * $a Then
GUICtrlSetData($ProgressBar, $a)
$a += 1
EndIf
$b += 1
WEnd
FileClose($hFile)
FileClose($folderdestname)
$attrib = FileGetAttrib($result[$r])
FileSetAttrib($filedestname, $attrib)
Next
$emptyfolder = _FO_SearchEmptyFolders($ArrayFileCopy[$ar][0], 1)
If Not @error Then
For $i = 1 To $emptyfolder[0]
$pathdestreplace = StringReplace($emptyfolder[$i], '\', '', -1)
$emptyfoldername = $dirname & StringReplace($pathdestreplace, $ArrayFileCopy[$ar][0], '', 1)
DirCreate($emptyfoldername)
Next
EndIf
Next
If $z = 0 And $x = 0 And $y = 0 Then
If $guimsg = 1 Then
GUIRegisterMsg(0x0111, '')
EndIf
GUICtrlSetData($ProgressBar, 100)
Sleep(1000)
GUICtrlSetData($ProgressBar, '')
Return 0
ElseIf $y = UBound($ArrayFileCopy) Or $x = UBound($result) Or $z = UBound($result) Or $null = UBound($ArrayFileCopy) Then
If $guimsg = 1 Then
GUIRegisterMsg(0x0111, '')
EndIf
Return 4
Else
If $guimsg = 1 Then
GUIRegisterMsg(0x0111, '')
EndIf
GUICtrlSetData($ProgressBar, 100)
Sleep(1000)
GUICtrlSetData($ProgressBar, '')
Return 5
EndIf
EndFunc ;==>_CopyDirCopyFile
Func WM_COMMAND_Copy_Gui($hWnd, $Msg, $wParam, $lParam)
Local $nNotifyCode = BitShift($wParam, 16)
Local $nID = BitAND($wParam, 0xFFFF)
Switch $nNotifyCode
Case 0
Switch $nID
Case $ButtonStop
$ExitFunc = 1
GUIRegisterMsg(0x0111, '')
Case $ButtonPause
If $Pause = 0 Then
$Pause = 1
Else
$Pause = 0
EndIf
EndSwitch
EndSwitch
Return 'GUI_RUNDEFMSG'
EndFunc ;==>WM_COMMAND_Copy_Guii