Что нового

[Автоматизация] Создать архив с папками и выбранными файлами

defens

Знающий
Сообщения
89
Репутация
5
Как создать архив с папками как оригинале, но с теми файлами что нужны. А то у меня получилось просто одни выбранные файлы без папок
Код:
#include <Zip.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$Form1 = GUICreate("БИБЛИОТЕКА", 203, 137, 192, 124)
$Checkbox1 = GUICtrlCreateCheckbox("АРХИВИРОВАТЬ 1", 40, 9, 126, 17)
$Checkbox2 = GUICtrlCreateCheckbox("АРХИВИРОВАТЬ 2", 40, 30, 126, 17)
$Checkbox3 = GUICtrlCreateCheckbox("АРХИВИРОВАТЬ 3", 40, 51, 126, 17)
$Checkbox4 = GUICtrlCreateCheckbox("АРХИВИРОВАТЬ 4", 40, 72, 126, 17)
$Button1 = GUICtrlCreateButton("НАЧАТЬ", 64, 102, 75, 25)
GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button1
            If GUICtrlRead($Checkbox1) = $GUI_UNCHECKED And GUICtrlRead($Checkbox2) = $GUI_UNCHECKED And GUICtrlRead($Checkbox3) = $GUI_UNCHECKED And GUICtrlRead($Checkbox4) = $GUI_UNCHECKED Then
                MsgBox(0, '', 'Не выбранны файлы')
            Else
                $save = FileSaveDialog('Choose folder.', @ScriptDir, 'Zip arhive (*.zip)')
				$arhive = _Zip_Create($save & "\New_2016.zip") ; создаём архив
                If GUICtrlRead($Checkbox1) = $GUI_CHECKED Then _Zip_AddFile($arhive, 'F:\Рабочий стол\New_2016\56\договор56.pdf')
                If GUICtrlRead($Checkbox2) = $GUI_CHECKED Then _Zip_AddFile($arhive, 'F:\Рабочий стол\New_2016\45\договор45.pdf')
                If GUICtrlRead($Checkbox3) = $GUI_CHECKED Then _Zip_AddFile($arhive, 'F:\Рабочий стол\New_2016\85\договор85.pdf')
                If GUICtrlRead($Checkbox4) = $GUI_CHECKED Then _Zip_AddFile($arhive, 'F:\Рабочий стол\New_2016\13\договор13.pdf')
                MsgBox(0, '', 'Архив создан !')
            EndIf
    EndSwitch
WEnd
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
в русской справке есть функция
_Zip_AddItem , которая позволяет добавить папку(создать) в архив.
Если не критично, то можно использовать другой метод
Код:
#include <7ZipM.au3>
Global $endex, $flc, $tp
Global $Form1 = GUICreate("Form1", 566, 151, 636, 197)
Global $Progress1 = GUICtrlCreateProgress(64, 56, 438, 17)
Local $Button1 = GUICtrlCreateButton("Старт", 80, 104, 75, 25)
Global $Button2 = GUICtrlCreateButton("Стоп", 440, 104, 75, 25)
GUISetState()
Global $PackFilder[4] = ['D:\1', 'D:\2', 'D:\3', 'D:\4']
Global $sizefolder
While 1
	If $endex Then
		GUICtrlSetData($Progress1, '')
		GUIRegisterMsg(0x0111, '')
		_7ZipShutdown()
		$endex = 0
	EndIf
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case -3
			Exit
		Case $Button1
			GUIRegisterMsg(0x0111, 'WM_COMMAND')
			_7ZipStartup()
			_7ZipSetOwnerWindowEx($Form1, "_ARCHIVERPROC")
			For $i = 0 To UBound($PackFilder) - 1
				$sizefolder += DirGetSize($PackFilder[$i])
			Next
			For $i = 0 To UBound($PackFilder) - 1
				_7ZipAdd($Form1, _ANSIToOEM(@ScriptDir & '\test.7z'), _ANSIToOEM($PackFilder[$i]), 1, 9, 0)
				If $endex Then
					GUICtrlSetData($Progress1, '')
					GUIRegisterMsg(0x0111, '')
					_7ZipShutdown()
					$endex = 0
					FileDelete(@ScriptDir & '\test.7z')
					ExitLoop
				EndIf
			Next
			_7ZipKillOwnerWindowEx($Form1)
			_7ZipShutdown()
			GUICtrlSetData($Progress1, '')
			GUIRegisterMsg(0x0111, '')
		Case $Button2
	EndSwitch
WEnd

Func _ARCHIVERPROC($hWnd, $Msg, $nState, $ExInfo)
	Local $iWriteSize, $iPercent = 0
	If $flc Then
		_7ZipKillOwnerWindowEx($Form1)
		$endex = 1
		$flc = 0
		Return
	EndIf
	If $nState = 1 Then
		Local $PACKINFO = DllStructCreate($tagINDIVIDUALINFO, $ExInfo)
		$iWriteSize = DllStructGetData($PACKINFO, "dwCompressedSize")
		$iPercent = Int($iWriteSize / $sizefolder * 100)
		GUICtrlSetData($Progress1, $iPercent)
		Return 1
	EndIf
	If $nState = 2 Then GUICtrlSetData($Progress1, 100)
	Return 1
EndFunc   ;==>_ARCHIVERPROC

Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
	Local $nNotifyCode = BitShift($wParam, 16)
	Local $nID = BitAND($wParam, 0xFFFF)
	Switch $nNotifyCode
		Case 0
			Switch $nID
				Case $Button2
					$flc = 1
			EndSwitch
	EndSwitch
	Return 'GUI_RUNDEFMSG'
EndFunc   ;==>WM_COMMAND
7-zip32.dll и 7ZipM.au3 здесь http://autoit-script.ru/index.php?topic=21204.0

ссылка "Исходники"
 
Автор
D

defens

Знающий
Сообщения
89
Репутация
5
joiner сказал(а):
в русской справке есть функция
_Zip_AddItem , которая позволяет добавить папку(создать) в архив.
это под другой include в Zip.au3 значит нет этой возможности надо использоваться _Zip.au3 попробую ее найти использовать
и за альтернативу тоже спасибо, не критично, её попробую в другом применить с ней дольше разбираться, да и в элементарном архивировании наверное лучше Zip или 7Zip использовать

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

И при добавлении папки, если она не конечна и там еще есть папки внутри дает ошибку №8, думаю это не то что мне нужно, хотя может что делаю не так

решил просто созданием обычной папки с вложенными папка и в конечную папку просто копировать то что надо, а потом архивировать
 
Верх