Что нового

[Файловая система] Копирование файлов, отображение прогресса копирования в GUI

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Версия AutoIt
3.3.12.0
Версия
1.0
Функция копирует папку, один или несколько выбранных файлов и отображает процесс копирования в элементе GUI, который создан функцией GUICtrlCreateProgress.
В функции была попытка синхронизировать процесс копирования и заполнение полосы прогресса в GUI, чтобы видны были реальные этапы выполнения копирования.

Копирование реализовано функциями
Код:
FileRead  FileWrite


Работа с массивами в качестве входящих данных, а также получение путей через диалог открытия файла или выбора папки. Возможность останавливать или ставить на паузу

Исходник

Пример
Код:
Local $array[1][2]
$array[0][0] = 'Полный путь к папке или файлу'
$array[0][1] = 'Полный путь к папке'

$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, 'Далее'); входящие данные $array - двумерный массив
            $ret = _CopyDirCopyFile($Source, $Dest, 0, 1, 1, $Progress, $BtExit, $BtPause, 'Далее')
    EndSwitch
WEnd


Для работы функции необходима библиотека http://autoit-script.ru/index.php/topic,14598.0.html
 
Автор
joiner
Последнее редактирование:
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Функция расширена, добавлены новые возможности копирования файлов и папок. Добавлено описание функции
Все подробности в первом сообщении.
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
немного оптимизировал код. учел ошибки при чтении исходных файлов.
добавил наследование атрибутов для файлов. атрибуты папок не сохраняются.
в функции по прежнему остаются обязательными только первые два параметра.
 

Mancoffee

Свет проталкивает тьму ...
Сообщения
86
Репутация
1
Например, у меня есть скрипт
Код:
#NoTrayIcon
$AppDataLocalDir = 'c:\Users\User\AppData\Local'
$AppDataLocalDirHome = 'd:\Saves\Programs\Users\User\AppData\Roaming'
$ProgramDataHome = 'd:\Saves\Programs\Users\User\ProgramData'
$ProgramData = 'C:\ProgramData'

DirCopy(@AppDataDir & '\Adobe\Adobe Photoshop CS6\Adobe Photoshop CS6 Settings',  $AppDataLocalDirHome & '\Adobe\Adobe Photoshop CS6\Adobe Photoshop CS6 Settings', 1)
DirCopy(@AppDataDir & '\Adobe\Adobe Illustrator CS6 Settings', $AppDataLocalDirHome & '\Adobe\Adobe Illustrator CS6 Settings', 1)
DirCopy(@AppDataDir & '\Adobe\Dreamweaver CS6', $AppDataLocalDirHome & '\Adobe\Dreamweaver CS6', 1)
DirCopy($AppDataLocalDir & '\', $AppDataLocalDirHome & '\Adobe\Flash CS6', 1)
DirCopy(@AppDataDir & '\Console', $AppDataLocalDirHome & '\Console', 1)
DirCopy(@AppDataDir & '\IndigoRose', $AppDataLocalDirHome & '\IndigoRose', 1)
DirCopy(@AppDataDir & '\Corel\CorelDRAW Graphics Suite X6', $AppDataLocalDirHome & '\Corel\CorelDRAW Graphics Suite X6', 1)
DirCopy(@AppDataDir & '\FileZilla', $AppDataLocalDirHome & '\FileZilla', 1)
DirCopy(@AppDataDir & '\NetBeans', $AppDataLocalDirHome & '\NetBeans', 1)
DirCopy(@AppDataDir & '\Htpasswd Generator', $AppDataLocalDirHome & '\Htpasswd Generator', 1)
DirCopy(@AppDataDir & '\SkyMonk', $AppDataLocalDirHome & '\SkyMonk', 1)
DirCopy($AppDataLocalDir & '\StarDock\ObjectDockPlus', 'd:\Saves\Programs\Users\Strek\AppData\Local\StarDock\ObjectDockPlus', 1)
DirCopy($AppDataLocalDir & '\Yandex\Praetorian\', 'd:\Saves\Programs\Users\Strek\AppData\Local\Yandex\Praetorian\', 1)
DirCopy(@AppDataDir & '\DVDVideoSoft\FreeAudioConverter\FreeAudioConverterProfile.xml', $AppDataLocalDirHome & '\DVDVideoSoft\FreeAudioConverter\FreeAudioConverterProfile.xml', 1)
DirCopy(@AppDataDir & '\WinRAR\Themes', $AppDataLocalDirHome & '\WinRAR\Themes', 1)
DirCopy(@AppDataDir & '\Hulubulu\HotKeyMan\Data', $AppDataLocalDirHome & '\Hulubulu\HotKeyMan\Data', 1)
DirCopy(@AppDataDir & '\Synaptics\Profiles', $AppDataLocalDirHome & '\Synaptics\Profiles', 1)
DirCopy($ProgramData & '\Solo9', $ProgramDataHome & '\Solo9', 1)
FileCopy(@AppDataDir & '\Mozilla\Firefox\profiles.ini', 'd:\Programs\TotalCommander\Launching\Soft\Internet\Firefox\Data\', 1)
FileCopy(@AppDataDir & '\DAEMON Tools Pro\ImageCatalog.xml', $AppDataLocalDirHome & '\DAEMON Tools Pro\ImageCatalog.xml', 1)
;DirCopy(@AppDataDir & '\', $AppDataLocalDirHome & '\', 1)

;~ RunWait('regedit.exe /e c:\1.reg HKEY_CURRENT_USER\AppEvents\Schemes')
; or example:
;~ $path = @DesktopDir & "\registry.txt"
;~ $cache = ""
;~ ShellExecuteWait("regedit.exe", "/e "&$path&" HKEY_CLASSES_ROOT\.ico")
;~ $cache &= FileRead($path)
;~ ShellExecuteWait("regedit.exe", "/e "&$path&" HKEY_CLASSES_ROOT\.eml")
;~ $cache &= FileRead($path)
;~ ShellExecuteWait("regedit.exe", "/e "&$path&" HKEY_CLASSES_ROOT\.txt")
;~ $cache &= FileRead($path)
;~ FileOpen($path, 2)
;~ FileWrite($path, $cache)
;~ FileClose($path)
ShellExecuteWait('regedit.exe','/e SoundShemes.reg HKEY_CURRENT_USER\AppEvents\Schemes', 'd:\Saves\Programs\Users\Strek\AppData\Roaming')
ShellExecuteWait('regedit.exe','/e Zentimo.reg HKEY_CURRENT_USER\Software\Zentimo', 'd:\Saves\Programs\Users\Strek\AppData\Roaming')
ShellExecuteWait('regedit.exe','/e 7TaskbarTweaker.reg "HKEY_CURRENT_USER\Software\7 Taskbar Tweaker"', 'd:\Saves\Programs\Users\Strek\AppData\Roaming')
ShellExecuteWait('regedit.exe','/e KMPlayer.reg HKEY_CURRENT_USER\Software\KMPlayer', 'd:\Saves\Programs\Users\Strek\AppData\Roaming')
ShellExecuteWait('regedit.exe','/e WinRaR.reg HKEY_CURRENT_USER\Software\WinRAR', 'd:\Saves\Programs\Users\Strek\AppData\Roaming')
Как мне применить этот ProgressBar?
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
в функции нельзя выбрать сразу несколько папок, только одну. а в ней уже могут быть вложенные папки.
в итоге : чтобы скопировать несколько папок, которые находятся в разных местах, нужно создать массив из путей: исходный - назначения.
естественно не будет общей полосы прогресса. при копировании одной папки полоса будет заполняться на сто процентов, потом будет виден прогресс копирования второй папки и опять до ста процентов и так далее. вот накидал пример. в окне будет отображаться прогресс копирования, текущая копируемая папка и количество скопированных папок
пример для случая, если все пути заранее известны и постоянны.

Код:
Dim $array[6][2]
$array[1][0] = 'исходная папка'
$array[2][0] = 'исходная папка'
$array[3][0] = 'исходная папка'
$array[4][0] = 'исходная папка'
$array[5][0] = 'исходная папка'

$array[1][1] = 'папка назначения'
$array[2][1] = 'папка назначения'
$array[3][1] = 'папка назначения'
$array[4][1] = 'папка назначения'
$array[5][1] = 'папка назначения'

$Form1 = GUICreate("Form1", 491, 128, 360, 419)
$Progress1 = GUICtrlCreateProgress(24, 32, 422, 17)
$Button1 = GUICtrlCreateButton("Start", 40, 72, 75, 25)
$label = GUICtrlCreateLabel('', 24, 15, 422, 17)
$label1 = GUICtrlCreateLabel('', 150, 72, 75, 25)
GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case -3
			Exit
		Case $Button1
			For $i = 1 To UBound($array) - 1
				GUICtrlSetData($label, StringRegExpReplace($array[$i][0],'.*\\', '')); текущая копируемая папка
				$ret = _CopyDirCopyFile($array[$i][0], $array[$i][1], $Progress1)
				GUICtrlSetData($label1, $i); количество скопированных папок
			Next
			GUICtrlSetData($label, '')
			GUICtrlSetData($label1, '')
	EndSwitch
WEnd

если путь назначения один, то достаточно будет массива, содержащего только исходные пути. то есть одномерного
 

Mancoffee

Свет проталкивает тьму ...
Сообщения
86
Репутация
1
joiner
Подключил "Функцию" в скрипт, выполнил, показалось окошко, нажал "Start", быстро прошёл прогресс (1,2,3,4,5 как секунды), а сам скрипт остановился здесь "--> Press Ctrl+Alt+F5 to Restart or Ctrl+Break to Stop" и ничего не скопировалось.
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
путь назначения неверен был или запись запрещена . можно посмотреть что в консоли записывает функция. я чуть позже поправлю функцию, чтобы не было холостого хода с несуществующими путями.
вот мои настоящие пути, которые я использовал
Код:
$array[1][0] = 'C:\Users\master\Desktop\антивирус'
$array[2][0] = 'C:\Users\master\Desktop\антивирус\AVSETUP_51132577'
$array[3][0] = 'C:\Users\master\Desktop\антивирус\avz4\avz4'
$array[4][0] = 'D:\архив_master\Downloads\Архивы\dfe538TX_Driver_300\DFE-538TX-Vistax64'
$array[5][0] = 'D:\архив_master\Downloads\Архивы\dfe538TX_Driver_300\DFE-538TX-Vistax86'

$array[1][1] = 'D:\1'
$array[2][1] = 'D:\2'
$array[3][1] = 'D:\3'
$array[4][1] = 'D:\4'
$array[5][1] = 'D:\5'

все сработало.
 

Mancoffee

Свет проталкивает тьму ...
Сообщения
86
Репутация
1
joiner
Нашёл ошибку :smile: (В кавычки взял путь с переменными)
Спасибо!

Можно сделать, чтобы после успешного завершения окно само закрывалось?
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
после окончания цикла копирования поставь
Код:
exit
 

Mancoffee

Свет проталкивает тьму ...
Сообщения
86
Репутация
1
joiner
joiner сказал(а):
после окончания цикла копирования поставь
Код: AutoIt [Выделить]
exit

Не хочет

Код:
GUICtrlSetData($label, '')
            GUICtrlSetData($label1, '')
    EndSwitch
WEnd
Exit
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
вот так
Код:
GUICtrlSetData($label, '')
            GUICtrlSetData($label1, '')
exit
    EndSwitch
WEnd
 

Mancoffee

Свет проталкивает тьму ...
Сообщения
86
Репутация
1
joiner
Спасибо ещё раз!

Извини, если напрягаю :smile:, как прикрутить кнопку "Stop"?
И как дальше (в циклах и массивах ещё не силён)? Так?

Код:
...
$array[6][0] = Dir6
$array[7][0] = Dir7
...
$array[6][1] = Dir6
$array[7][1] = Dir7
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Mancoffee [?]
И как дальше (в циклах и массивах ещё не силён)? Так?
да так. делай проверку через
Код:
_ArrayDisplay($array)

будет видно что получилось
насчет остановки функции есть темы на форуме



Добавлено:
Сообщение автоматически объединено:

изменения в функции:
1. учтен момент, если во время копирования исходный путь или путь назначения не существуют или есть запрет на запись , происходит выход из функции.
2. доработана визуальная часть - при невозможности копирования (смотри пункт 1) полоса прогресса не заполняется
3. пропуск файлов, которые нельзя скопировать.
изменены описания возвращаемых значений
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Второй вариант функции.
Функция может быть остановлена кнопкой в окне программы.
Это дополнительный параметр функции, и не является обязательным. Смотри описание функции в примере

Функция + пример
Код:
#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
 

Mancoffee

Свет проталкивает тьму ...
Сообщения
86
Репутация
1
joiner
Сложности мне создаёшь :smile:
Я с этим долго разбираться буду.
Подскажи тогда, я на правильном пути? Мне нужно это ...

Код:
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
            EndSwitch
    EndSwitch
    Return 'GUI_RUNDEFMSG'
EndFunc   ;==>WM_COMMAND


... внедрить в твой скрипт №1?
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Mancoffee
основная функция в первом сообщении. о применении которой мы с тобой говорили выше.
второй вариант это все вместе

этот вариант как раз с остановкой по нажатию кнопки. как ты и хотел . :smile:
 

Mancoffee

Свет проталкивает тьму ...
Сообщения
86
Репутация
1
joiner
Всё вместе, но я запустил скрипт, а у меня выскочило окошко и если нажимаешь старт, то нужно выбрать "что", а потом "куда". Это не тоже самое :whistle:
Я так под-устану настройки копировать :smile:
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
ну так второй вариант уже с примером. ты пример удали и у тебя должно остаться так

Код:
#include <FileOperations.au3>
#include <File.au3>
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
и используй свой пример. ну хотя бы тот с массивами. разницы нет. обязательны только два первых параметра
 

Mancoffee

Свет проталкивает тьму ...
Сообщения
86
Репутация
1
joiner
Если так
Код:
#NoTrayIcon
#include <Array.au3>
#include <WindowsConstants.au3>

$MainWin= GUICreate('Сохранение настроек', 350, 128, -1, 568)
$Progress = GUICtrlCreateProgress(24, 32, 300, 17)
$BtStart = GUICtrlCreateButton("Старт", 40, 60, 75, 25)
$BtPause = GUICtrlCreateButton("Пауза", 136, 60, 75, 25)
$BtReg = GUICtrlCreateButton("RegOut", 136, 97, 75, 25)
$BtExit = GUICtrlCreateButton('Выйти', 230, 60, 75, 25)
$NameCopy = GUICtrlCreateLabel('', 24, 15, 300, 17)
$Count = GUICtrlCreateLabel('', 325, 15, 300, 25)
GUISetState(@SW_SHOW)
WinSetOnTop('Сохранение настроек', '', 1)

$AppDataLocalDir = 'c:\Users\User\AppData\Local'
$AppDataLocalDirHome = 'd:\Saves\Programs\Users\User\AppData\Local'
$AppDataDirHome = 'd:\Saves\Programs\Users\User\AppData\Roaming'
$ProgramDataDir = 'C:\ProgramData'
$ProgramDataDirHome = 'd:\Saves\Programs\Users\User\ProgramData'

Dim $array[22][2]
$array[1][0] = @AppDataDir & "\Adobe\Adobe Photoshop CS6\Adobe Photoshop CS6 Settings"
$array[2][0] = @AppDataDir & '\Adobe\Adobe Illustrator CS6 Settings'
$array[3][0] = @AppDataDir & '\Adobe\Dreamweaver CS6\Configuration'
$array[4][0] = $AppDataLocalDir & '\Adobe\Flash CS6'
$array[5][0] = @AppDataDir & "\Console"
$array[6][0] = @AppDataDir & '\IndigoRose'
$array[7][0] = @AppDataDir & '\Corel\CorelDRAW Graphics Suite X6'
$array[8][0] = @AppDataDir & '\FileZilla'
$array[9][0] = @AppDataDir & '\NetBeans'
$array[10][0] = @AppDataDir & '\Htpasswd Generator'
$array[11][0] = @AppDataDir & '\SkyMonk'
$array[12][0] = $AppDataLocalDir & '\StarDock\ObjectDockPlus'
$array[13][0] = $AppDataLocalDir & '\Yandex\Praetorian\'
$array[14][0] = @AppDataDir & '\WinRAR\Themes'
$array[15][0] = @AppDataDir & '\Hulubulu\HotKeyMan\Data'
$array[16][0] = @AppDataDir & '\Synaptics\Profiles'
$array[17][0] = $ProgramDataDir & '\Solo9'
$array[18][0] = @AppDataDir & '\Mozilla\Firefox\profiles.ini'
$array[19][0] = @AppDataDir & '\DAEMON Tools Pro\ImageCatalog.xml'
$array[20][0] =@AppDataDir & '\DVDVideoSoft\FreeAudioConverter\FreeAudioConverterProfile.xml'
$array[21][0] = @AppDataDir & '\Microsoft\Windows\Start Menu\Programs\My Apps'

$array[1][1] = $AppDataDirHome & '\Adobe\Adobe Photoshop CS6\'
$array[2][1] = $AppDataDirHome & '\Adobe\'
$array[3][1] = $AppDataDirHome & '\Adobe\Dreamweaver CS6'
$array[4][1] = $AppDataLocalDirHome & '\Adobe\'
$array[5][1] = $AppDataDirHome
$array[6][1] = $AppDataLocalDirHome
$array[7][1] = $AppDataDirHome & '\Corel\'
$array[8][1] = $AppDataDirHome
$array[9][1] = $AppDataDirHome
$array[10][1] = $AppDataDirHome
$array[11][1] = $AppDataDirHome
$array[12][1] = $AppDataLocalDirHome & '\StarDock\'
$array[13][1] = $AppDataLocalDir & '\Yandex\'
$array[14][1] =  $AppDataDirHome & '\WinRAR\'
$array[15][1] = $AppDataDirHome & '\Hulubulu\HotKeyMan\'
$array[16][1] = $AppDataDirHome & '\Synaptics\'
$array[17][1] = $ProgramDataDirHome & '\Solo9\'
$array[18][1] = 'd:\Programs\TotalCommander\Launching\Soft\Internet\Firefox\Data\'
$array[19][1] = $AppDataDirHome & '\DAEMON Tools Pro\ImageCatalog.xml'
$array[20][1] = $AppDataDirHome & '\DVDVideoSoft\FreeAudioConverter\FreeAudioConverterProfile.xml'
$array[21][1] = $AppDataDirHome & '\Microsoft\Windows\Start Menu\Programs\'

#include <FileOperations.au3>
#include <File.au3>
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]
        If $ExitFunc = 1 Then
            Return 6
        EndIf
        $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)
                        EndIf
                    Case $FileCopy = 1
                        $filedestname = $dirname & StringReplace($result[$r], $FileSourch, '', 1)
                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], '.*\\', '')
                            EndIf
                        Case $FileCopy = 1
                            $filedestname = $FileDest & '\' & StringRegExpReplace($result[$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
    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
            EndSwitch
    EndSwitch
    Return 'GUI_RUNDEFMSG'
EndFunc   ;==>WM_COMMAND
то выскакивает окошко на миллисекунды и сразу исчезает.
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Mancoffee
а цикл где?
Код:
While 1
......
Wend

справку посмотри
Код:
GuiCreate
 
Верх