#include <FileOperations.au3>
#include <File.au3>
$Form1 = GUICreate("Form1", 491, 128, 360, 419)
$Progress1 = GUICtrlCreateProgress(24, 32, 422, 17)
$Button1 = GUICtrlCreateButton("Start", 40, 72, 75, 25)
$Button2 = GUICtrlCreateButton('Stop', 150, 72, 75, 25)
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case -3
Exit
Case $Button1
$sourch = FileSelectFolder('', '', 1 + 2 + 4, '', $Form1)
$dest = FileSelectFolder('', '', 1 + 2 + 4, '', $Form1)
$ret = _CopyDirCopyFile($sourch, $dest, $Progress1,1,1,$Button2)
ConsoleWrite($ret & @CRLF)
EndSwitch
WEnd
; Функция ====================================================================================================
; Имя.................: _CopyDirCopyFile
; Синтаксис...........: _CopyDirCopyFile($FileSourch, $FileDest, $ProgressBar = '', $FolderCopy = 1, $FileCopy = 1, $ButtonFuncStop = '')
; Назначение..........: Копирование файлов и папок, отображение процесса копирования в элементе, созданном функцией GUICtrlCreateProgress
; Параметры...........: $FileSourch - Копируемые файлы или папки (возможен выбор нескольких файлов)
; $FileDest - Путь копирования
; |$ProgressBar = '' (по умолчанию) - Переменная элемента, созданного функцией GUICtrlCreateProgress
; |$FolderCopy = 1 (по умолчанию) - Если в месте назначения есть папка с таким же именем, то она будет перезаписана.
; |$FolderCopy = 0 - Если в месте назначения есть папка с таким же именем, то у копируемой папки будет изменено имя
; |$FileCopy = 1 (по умолчанию) - Файлы со сходными именами в месте назначения будут перезаписаны
; |$FileCopy = 0 - будут созданы копии файлов, имена которых совпадают
; |$ButtonFuncStop = '' - Переменная элемента, созданного функцией GUICtrlCreateButton
;Возвращаемые значения: 0 - успешное выполнение
; 1 - исходный путь не существует(папка или файл)
; 2 - путь назначения не существует
; 3 - невозможно копирование папки
; 4 - файлы не скопированы, неверен путь\не найдены файлы или нет прав на чтение\запись
; 5 - некоторые файлы не скопированы
; 6 - остановка функции пользователем
; =============================================================================================================
Func _CopyDirCopyFile($FileSourch, $FileDest, $ProgressBar = '', $FolderCopy = 1, $FileCopy = 1, $ButtonFuncStop = '')
If Not $FileSourch Then Return 1
If Not $FileDest Then Return 2
Global $ExitFunc = 0, $ButtonStop = $ButtonFuncStop
Local $s = 4096, $a = 1, $b = 1, $size_all = 0, $flag = 0
Dim $szDrive, $szDir, $szFName, $szExt, $Drive, $Dir, $FName, $Ext
$pathcheck = _PathSplit($FileDest, $Drive, $Dir, $FName, $Ext)
If $pathcheck[1] = '' Then Return 4
$var_string = StringReplace($FileSourch, "|", '\', 1)
$path = _PathSplit($var_string, $szDrive, $szDir, $szFName, $szExt)
$attrib_fd = FileGetAttrib($FileSourch)
$fd_s = StringInStr($attrib_fd, 'D')
If Not $fd_s = 0 Then
$flag = 1
$dir_name = StringRegExpReplace($FileSourch, '.*\\', '')
Select
Case $FolderCopy = 0
If FileExists($FileDest & '\' & $dir_name) Then
$dirname = $FileDest & '\' & $dir_name & '_' & @SEC & @MSEC
$result = _FO_FileSearch($FileSourch, '*', True, 125)
If @error Then
$dircopy = DirCopy($FileSourch, $dirname)
If $dircopy = 0 Then
Return 3
Else
GUICtrlSetData($ProgressBar, 100)
Sleep(1000)
GUICtrlSetData($ProgressBar, '')
Return 0
EndIf
EndIf
Else
$dirname = $FileDest & '\' & $dir_name
$result = _FO_FileSearch($FileSourch, '*', True, 125)
If @error Then
$dircopy = DirCopy($FileSourch, $dirname)
If $dircopy = 0 Then
Return 3
Else
GUICtrlSetData($ProgressBar, 100)
Sleep(1000)
GUICtrlSetData($ProgressBar, '')
Return 0
EndIf
EndIf
EndIf
Case $FolderCopy = 1
$dirname = $FileDest & '\' & $dir_name
$result = _FO_FileSearch($FileSourch, '*', True, 125)
If @error Then
$replacepath = StringReplace($path[1] & $path[2], '\', '', -1)
$compare = StringCompare($FileDest, $replacepath)
If $compare = 0 Then
Return 3
Else
$dircopy = DirCopy($FileSourch, $dirname, 1)
If $dircopy = 0 Then
Return 3
Else
GUICtrlSetData($ProgressBar, 100)
Sleep(1000)
GUICtrlSetData($ProgressBar, '')
Return 0
EndIf
EndIf
Else
$replacepath = StringReplace($path[1] & $path[2], '\', '', -1)
$compare = StringCompare($FileDest, $replacepath)
If $compare = 0 Then
Return 3
EndIf
EndIf
EndSelect
Else
$flag = 2
$replace = StringReplace($var_string, '|', '*' & $path[1] & $path[2])
$result = StringSplit($replace, '*')
If $result[0] = 1 Then
If FileExists($result[1]) = 0 Then
Return 1
EndIf
EndIf
$attrib_f = FileGetAttrib($FileDest)
$f_s = StringInStr($attrib_f, 'D')
EndIf
For $i = 1 To $result[0]
$size = FileGetSize($result[$i])
$size_all += $size
Next
$round = Ceiling($size_all / $s)
$step = Ceiling($round / 100)
$z = 0
$x = 0
GUIRegisterMsg(0x0111, 'WM_COMMAND')
For $r = 1 To $result[0]
If $ExitFunc = 1 Then
GUICtrlSetData($ProgressBar, '')
Return 6
EndIf
Select
Case $flag = 1
Select
Case $FileCopy = 0
If FileExists($dirname & StringReplace($result[$r], $FileSourch, '', 1)) Then
$filenamestring = StringRegExpReplace($dirname & StringReplace($result[$r], $FileSourch, '', 1), '.*\\', '')
$pathreplace = StringReplace($dirname & StringReplace($result[$r], $FileSourch, '', 1), $filenamestring, '', -1)
$filedestname = $pathreplace & @SEC & @MSEC & '_' & $filenamestring
Else
$filedestname = $dirname & StringReplace($result[$r], $FileSourch, '', 1)
If FileExists($filedestname) Then FileSetAttrib($filedestname,'-R')
EndIf
Case $FileCopy = 1
$filedestname = $dirname & StringReplace($result[$r], $FileSourch, '', 1)
If FileExists($filedestname) Then FileSetAttrib($filedestname,'-R')
EndSelect
Case $flag = 2
If Not $f_s = 0 Then
Select
Case $FileCopy = 0
If FileExists($FileDest & '\' & StringRegExpReplace($result[$r], '.*\\', '')) Then
$filenamestring = StringRegExpReplace($result[$r], '.*\\', '')
$pathreplace = StringReplace($FileDest, $filenamestring, '', -1)
$filedestname = $pathreplace & '\' & @SEC & @MSEC & '_' & $filenamestring
Else
$filedestname = $FileDest & '\' & StringRegExpReplace($result[$r], '.*\\', '')
If FileExists($filedestname) Then FileSetAttrib($filedestname,'-R')
EndIf
Case $FileCopy = 1
$filedestname = $FileDest & '\' & StringRegExpReplace($result[$r], '.*\\', '')
If FileExists($filedestname) Then FileSetAttrib($filedestname,'-R')
EndSelect
Else
$filedestname = $FileDest
EndIf
EndSelect
$hFile = FileOpen($result[$r], 16)
If $hFile = -1 Then
$z = $z + 1
ContinueLoop
EndIf
$folderdestname = FileOpen($filedestname, 2 + 8 + 16)
If $folderdestname = -1 Then
FileClose($hFile)
$x = $x + 1
ContinueLoop
EndIf
While 1
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
ExitLoop
EndIf
$file_w = FileWrite($folderdestname, $sChars)
If $file_w = 0 Then ExitLoop
If $b = $step * $a Then
GUICtrlSetData($ProgressBar, $a)
$a = $a + 1
EndIf
$b = $b + 1
If $b = $round Then
GUICtrlSetData($ProgressBar, 100)
EndIf
WEnd
FileClose($hFile)
FileClose($folderdestname)
$attrib = FileGetAttrib($result[$r])
FileSetAttrib($filedestname, $attrib)
Next
$emptyfolder = _FO_SearchEmptyFolders($FileSourch, 1)
If Not @error Then
For $i = 1 To $emptyfolder[0]
$pathdestreplace = StringReplace($emptyfolder[$i], '\', '', -1)
$emptyfoldername = $dirname & StringReplace($pathdestreplace, $FileSourch, '', 1)
DirCreate($emptyfoldername)
Next
EndIf
GUIRegisterMsg(0x0111, '')
If $z = 0 And $x = 0 Then
GUICtrlSetData($ProgressBar, 100)
Sleep(1000)
GUICtrlSetData($ProgressBar, '')
Return 0
ElseIf $z = UBound($result) - 1 Or $x = UBound($result) - 1 Then
Return 4
Else
GUICtrlSetData($ProgressBar, 100)
Sleep(1000)
GUICtrlSetData($ProgressBar, '')
Return 5
EndIf
EndFunc ;==>_CopyDirCopyFile
Func WM_COMMAND($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, '')
EndSwitch
EndSwitch
Return 'GUI_RUNDEFMSG'
EndFunc ;==>WM_COMMAND