Что нового

Архиватор с прибамбасом

webmonster

Новичок
Сообщения
33
Репутация
0
Версия AutoIt: 3.

Описание:
Дано: dir1, содержащая dir2,dir3,dir4. Во всех папках лежат файлы. Нужен скрипт с GUI и опцией выбора файлов, чтобы можно было создать файл-лист, а затем запаковать выбранные файлы таким образом чтобы внутри архива было дерево каталогов начиная с корня папки dir1.

Примечания:
Для наглядности:
Если выбраны file1,file4 из dir1 и file99 из папки dir2, то результат должен быть следующий
dir1
-archive.zip
-dir1
-file1.*
-file4.*
-dir2
-file99.*
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
webmonster
Написал нечто подобное.
Для работы требуется архиватор WinRAR.
Архивирует в директорию скрипта.
Код скрипта:
Код:
#include <file.au3>
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ###
$Form1_1 = GUICreate("Надстройка WinRar", 627, 280, -1, -1)
$Label1 = GUICtrlCreateLabel("Список файлов для архивации (файл-лист):", 16, 8, 223, 17)
$Edit1 = GUICtrlCreateEdit("", 8, 32, 281, 145, BitOR($GUI_SS_DEFAULT_EDIT,$ES_READONLY))
GUICtrlSetData(-1, "")
$Button1 = GUICtrlCreateButton("Добавить файлы", 8, 184, 105, 25)
$Button2 = GUICtrlCreateButton("Выход", 512, 184, 105, 25)
$Button3 = GUICtrlCreateButton("Архивировать", 232, 184, 105, 25)
$Button4 = GUICtrlCreateButton("Установить пароль", 344, 184, 161, 25)
$Button5 = GUICtrlCreateButton("Очистить", 120, 184, 105, 25)
$Label2 = GUICtrlCreateLabel("Имя архива:", 296, 8, 67, 17)
$Input1 = GUICtrlCreateInput("TestArchive", 296, 32, 321, 21)
$Group1 = GUICtrlCreateGroup("Формат архива", 296, 56, 105, 65)
$Radio1 = GUICtrlCreateRadio("RAR", 304, 72, 49, 17)
GUICtrlSetState(-1, $GUI_CHECKED)
$Radio2 = GUICtrlCreateRadio("ZIP", 304, 96, 49, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Label3 = GUICtrlCreateLabel("Метод сжатия:", 296, 128, 79, 17)
$Combo1 = GUICtrlCreateCombo("Обычный", 296, 152, 105, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlSetData(-1, "Без сжатия|Скоростной|Быстрый|Обычный|Хороший|Максимальный")
$Group2 = GUICtrlCreateGroup("Параметры архивации", 408, 56, 209, 113)
$Checkbox1 = GUICtrlCreateCheckbox("SFX-архив", 416, 72, 97, 17)
$Checkbox2 = GUICtrlCreateCheckbox("Информация для восстановления", 416, 96, 193, 17)
$Checkbox3 = GUICtrlCreateCheckbox("Тестировать после упаковки", 416, 120, 185, 17)
$Checkbox4 = GUICtrlCreateCheckbox("Заблокировать архив", 416, 144, 193, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Input2 = GUICtrlCreateInput("", 120, 240, 497, 21, BitOR($GUI_SS_DEFAULT_INPUT,$ES_READONLY))
$Label4 = GUICtrlCreateLabel("Путь к архиватору WinRAR.exe:", 7, 217, 200, 17)
$Button6 = GUICtrlCreateButton("Обзор", 8, 240, 105, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###


GUICtrlSetData($Edit1, ListShow())
$RarPath = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\WinRAR archiver", "DisplayIcon")
If $RarPath = "" Then
    MsgBox(16, "Инфо", "Не найден архиватор WinRAR."&@CRLF&"Укажите путь к WinRAR.exe вручную (кнопка Обзор).")
Else
    GUICtrlSetData($Input2, $RarPath)    
EndIf
$Password = ""

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        
        Case $Radio1 ;RAR        
        GUICtrlSetState ( $Checkbox2, $GUI_ENABLE)
        GUICtrlSetState ( $Checkbox4, $GUI_ENABLE)
        Case $Radio2;ZIP
        GUICtrlSetState ( $Checkbox2, $GUI_UNCHECKED)
        GUICtrlSetState ( $Checkbox2, $GUI_DISABLE)
        GUICtrlSetState ( $Checkbox4, $GUI_UNCHECKED)
        GUICtrlSetState ( $Checkbox4, $GUI_DISABLE)
        Case $Button1 ;Добавить файлы
            AddFiles()            
            GUICtrlSetData($Edit1, ListShow())
        Case $Button2 ;Выход
            Exit
        Case $Button3 ;Архивировать
            Archive()
        Case $Button4 ;Установить пароль            
            $Password = InputBox("Архивация с паролем", "Введите пароль:", "", "*", 300, 50)
        Case $Button5 ;Очистить
            ListClear()
            GUICtrlSetData($Edit1, ListShow())
        Case $Button6 ;Обзор            
            GUICtrlSetData($Input2, AddPatchRar())        
    EndSwitch
WEnd

Func AddPatchRar()
    $message = "Укажите путь к WinRAR.exe"
    $Patch = FileOpenDialog($message, @HomeDrive, "Программы (*.exe)", 4)    
    If @error Then
        MsgBox(48,"Инфо","Файлы не выбраны.")        
    Else    
    MsgBox(64, "RAR", $Patch)
    Return $Patch
    EndIf
EndFunc

Func AddFiles()
    $message = "Удерживайте Ctrl или Shift для выбора нескольких файлов."
    $var1 = FileOpenDialog($message, @DesktopDir, "Все файлы (*.*)", 4)    
    If @error Then
        MsgBox(48,"Инфо","Файлы не выбраны.")        
    Else    
    $file = FileOpen(@ScriptDir&"\"&"ArchiveList.lst", 1)    
    $result = StringInStr($var1, "|")    
    If $result = 0 Then
        FileWriteLine($file, $var1)        
    EndIf    
    $var1 = StringSplit($var1, "|")        
    If $file = -1 Then
        MsgBox(16, "Ошибка", "Невозможно открыть файл.")
        Exit
    EndIf    
    For $i = 2 To $var1[0]
        FileWriteLine($file, $var1[1]&"\"&$var1[$i])        
    Next
    FileClose($file)
    EndIf
EndFunc

Func ListShow()    
    $file = FileOpen(@ScriptDir&"\"&"ArchiveList.lst", 0)    
    $List = FileRead($file)
    FileClose($file)
    Return $List
EndFunc

Func ListClear()
    If Not _FileCreate(@ScriptDir&"\"&"ArchiveList.lst") Then
        MsgBox(16,"Ошибка", " Ошибка создания или очистки файл-листа.      Ошибка:" & @error)
    EndIf
EndFunc

Func Archive()
    $RarPatch = GUICtrlRead($Input2)            
    $Rar = '"'&$RarPatch&'"'
    $Command = " a "
    $PatchArchive = "D:\proggg\rar_tools\"
    $NameArchive = "ArchiveBackup"    
    $ArchiveList = " @"& @ScriptDir & "\" & "ArchiveList.lst"
    $FormatArchive = ""
    $SFX = ""
    $Recovery = ""
    $Testing = ""
    $Lock = ""
    $Compress = ""    
    $Pass = ""
    
    $State1 = GUICtrlRead($Radio1)
    $State2 = GUICtrlRead($Checkbox1)
    $State3 = GUICtrlRead($Checkbox2)
    $State4 = GUICtrlRead($Checkbox3)
    $State5 = GUICtrlRead($Checkbox4)
    $State6 = GUICtrlRead($Combo1)
    $State7 = GUICtrlRead($Input1)    
        
    Switch $State6
        Case "Без сжатия"            
            $Compress = "-m0 "
        Case "Скоростной"            
            $Compress = "-m1 "
        Case "Быстрый"            
            $Compress = "-m2 "
        Case "Обычный"            
            $Compress = "-m3 "
        Case "Хороший"            
            $Compress = "-m4 "
        Case "Максимальный"            
            $Compress = "-m5 "
    EndSwitch
    
    If $State1 = 1 Then
        $FormatArchive = ".rar"
    Else
        $FormatArchive = ".zip"        
    EndIf
    
    If $State2 = 1 Then
        $SFX = "-sfx "    ;SFX архив
    EndIf
    
    If $State3 = 1 Then
        $Recovery = "-rr5p " ; информация для восстановления (5%)    
    EndIf
    
    If $State4 = 1 Then
        $Testing = "-t " ; тестировать после упаковки    
    EndIf
    
    If $State5 = 1 Then
        $Lock = "-k "    ; заблокировать архив
    EndIf
    
    If $State7 <> "" Then
        $NameArchive =     $State7 ; имя архива
    EndIf
    
    If $Password <> "" Then
        $Pass = "-hp"&$Password&" " ; пароль на архив и имена файлов в архиве
    EndIf
    
    If $RarPatch = "0" Then
        MsgBox(16, "Ошибка", "Путь к архиватору WinRAR.exe не указан!")
    Else        
        Run($Rar&$Command&$SFX&$Recovery&$Testing&$Lock&$Compress&$Pass&$PatchArchive&$NameArchive&$FormatArchive&$ArchiveList)
    EndIf    
EndFunc
 
Верх