#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#NoTrayIcon
$root11='общие2'
$root2='недостающие2'
$root3='общие1'
Global $Stack[50], $Stack1[50]
;создание оболочки
GUICreate("Сравнение каталогов",500,228, -1, -1, -1, $WS_EX_ACCEPTFILES) ; размер окна
$tab=GUICtrlCreateTab (0,2, 500,204) ; размер вкладки
$hTab = GUICtrlGetHandle($tab) ; (1) устранение проблем интерфейса чекбоксов
GUICtrlCreateLabel ("используйте drag-and-drop", 250,5,200,18)
$tab3=GUICtrlCreateTabitem ("Сравнение") ; имя вкладки
GUICtrlCreateLabel ("Каталог 1", 20,40,400,20)
$folder111=GUICtrlCreateInput ("", 20,60,420,22)
GUICtrlSetState(-1,8)
$filewim=GUICtrlCreateButton ("...", 455,59,27,24)
GUICtrlSetFont (-1,13)
GUICtrlCreateLabel ("Каталог 2 (здесь файлы не достающие каталогу 1)", 20,100,400,20)
$folder222=GUICtrlCreateInput ("", 20,120,420,22)
GUICtrlSetState(-1,8)
$filezip=GUICtrlCreateButton ("...", 455,119,27,24)
GUICtrlSetFont (-1,13)
$check=GUICtrlCreateCheckbox ("Создать структуру каталогов общих и недостающих файлов", 20,150,340,20)
GUICtrlSetTip(-1, "Структуры общих и недостающих файлов")
$checkroot=GUICtrlCreateCheckbox ("Источник общих файлов из каталога 1", 20,170,340,20)
GUICtrlSetTip(-1, "иначе копирование из второго каталога")
GuiCtrlSetState($checkroot, 1)
GUICtrlSetState($checkroot, $GUI_DISABLE)
$Upd=GUICtrlCreateButton ("Выполнить", 390,160,92,26)
GUICtrlSetTip(-1, "Начать создание списков")
$Label000=GUICtrlCreateLabel ('Строка состояния AZJIO 2010.02.11', 10,210,380,20)
$tab4=GUICtrlCreateTabitem (" ?") ; имя вкладки
GUICtrlCreateLabel ("Цель скрипта - создать список общих и недостающих файлов при сравнении одного LiveCD с другим. Это позволит сравнить файловые обновления сборки без учёта размера. Это позволит создать дополнительный загрузочный том wim,а используя файлы оригинальной сборки и тем самым сэкономить на размере добавляемых файлов. Создав два каталога общих файлов можно увидеть разницу в обьёме.", 20,30, 460,80)
GUICtrlCreateTabitem ("") ; конец вкладок
; (2) устранение проблем интерфейса, чекбоксов
Switch @OSVersion
Case 'WIN_2000', 'WIN_XP', 'WIN_2003'
$Part = 10
Case Else
$Part = 11
EndSwitch
$Color = _WinAPI_GetThemeColor($hTab, 'TAB', $Part, 1, 0x0EED)
If Not @error Then
; перечисление элементов, для которых нужно исправить проблему цвета
GUICtrlSetBkColor($check, $Color)
GUICtrlSetBkColor($checkroot, $Color)
EndIf
GUISetState ()
While 1
$msg = GUIGetMsg()
Select
Case $msg = $Upd
$root1=$root11
GUICtrlSetColor($Label000,0x000000)
GUICtrlSetFont($Label000,8.5, 400)
GUICtrlSetData($Label000, 'Выполняется ...')
; Читаем поля, проверяем наличие каталогов
$folder100=GUICtrlRead ($folder111)
$folder200=GUICtrlRead ($folder222)
If Not FileExists($folder100) Then
MsgBox(0, "Мелкая ошибка", 'Не указан каталог 1')
ContinueLoop
EndIf
If Not FileExists($folder200) Then
MsgBox(0, "Мелкая ошибка", 'Не указан каталог 2')
ContinueLoop
EndIf
; поиск файлов
FileFindNextFirst($folder200)
$filetxt1 = FileOpen(@ScriptDir&'\'&$root1&'_list1.txt', 2)
$filetxt2 = FileOpen(@ScriptDir&'\'&$root2&'_list2.txt', 2)
; проверка открытия файла для записи строки
If $filetxt1 = -1 Then
MsgBox(0, "Ошибка", "Не возможно открыть файл.")
Exit
EndIf
If $filetxt2 = -1 Then
MsgBox(0, "Ошибка", "Не возможно открыть файл.")
Exit
EndIf
; добавление заголовка
FileWrite($filetxt1, 'список присутствующих файлов'&@CRLF)
FileWrite($filetxt2, 'список отсутствующих файлов'&@CRLF)
While 1
$tempname = FileFindNext()
If $tempname = "" Then ExitLoop
; начало сравнения каталогов
$Path2 = StringTrimLeft($tempname, StringLen($folder200))
If FileExists($folder100&$Path2) Then
; если указан, то сменить имя каталога и источник общих файлов
If GUICtrlRead ($checkroot)=1 Then
$tempname=$folder100&'\'&$Path2
$root1=$root3
EndIf
If GUICtrlRead ($check)=1 Then FileCopy($tempname, @ScriptDir&'\'&$root1&'\'&$Path2, 9)
FileWrite($filetxt1, $folder100&$Path2&@CRLF)
Else
If GUICtrlRead ($check)=1 Then FileCopy($tempname, @ScriptDir&'\'&$root2&'\'&$Path2, 9)
FileWrite($filetxt2, $folder100&$Path2&@CRLF)
EndIf
WEnd
FileClose($filetxt1)
FileClose($filetxt2)
GUICtrlSetData($Label000, 'Выполнено !!!')
GUICtrlSetColor($Label000,0xEE0000)
GUICtrlSetFont($Label000,8.5, 700)
; управление чекбоксом
Case $msg = $check
If GUICtrlRead ($check)=1 Then
GUICtrlSetState($checkroot, $GUI_ENABLE)
Else
GUICtrlSetState($checkroot, $GUI_DISABLE)
EndIf
; кнопки "Обзор"
Case $msg = $filewim
$tmpwim = FileSelectFolder ( "Указать каталог 1",'','3',@WorkingDir & '')
GUICtrlSetData($folder111, $tmpwim)
Case $msg = $filezip
$tmpzip = FileSelectFolder ( "Указать каталог 2",'','3',@WorkingDir & '')
GUICtrlSetData($folder222, $tmpzip)
Case $msg = $GUI_EVENT_CLOSE
ExitLoop
EndSelect
WEnd
;========================================
; функция поиска всех файлов в каталоге (NIKZZZZ)
Func FileFindNextFirst($FindCat)
$Stack[0] = 1
$Stack1[1] = $FindCat
$Stack[$Stack[0]] = FileFindFirstFile($Stack1[$Stack[0]] & "\*.*")
Return $Stack[$Stack[0]]
EndFunc ;==>FileFindNextFirst
Func FileFindNext()
While 1
$file = FileFindNextFile($Stack[$Stack[0]])
If @error Then
FileClose($Stack[$Stack[0]])
If $Stack[0] = 1 Then
Return ""
Else
$Stack[0] -= 1
ContinueLoop
EndIf
Else
If StringInStr(FileGetAttrib($Stack1[$Stack[0]] & "\" & $file), "D") > 0 Then
$Stack[0] += 1
$Stack1[$Stack[0]] = $Stack1[$Stack[0] - 1] & "\" & $file
$Stack[$Stack[0]] = FileFindFirstFile($Stack1[$Stack[0]] & "\*.*")
ContinueLoop
Else
Return $Stack1[$Stack[0]] & "\" & $file
EndIf
EndIf
WEnd
EndFunc ;==>FileFindNext
; (3) устранение проблем интерфейса, чекбоксов
Func _WinAPI_GetThemeColor($hWnd, $sClass, $iPart, $iState, $iProp)
Local $hTheme = DllCall('uxtheme.dll', 'ptr', 'OpenThemeData', 'hwnd', $hWnd, 'wstr', $sClass)
Local $Ret = DllCall('uxtheme.dll', 'lresult', 'GetThemeColor', 'ptr', $hTheme[0], 'int', $iPart, 'int', $iState, 'int', $iProp, 'dword*', 0)
If (@error) Or ($Ret[0] < 0) Then
$Ret = -1
EndIf
DllCall('uxtheme.dll', 'lresult', 'CloseThemeData', 'ptr', $hTheme[0])
If $Ret = -1 Then
Return SetError(1, 0, -1)
EndIf
Return SetError(0, 0, BitOR(BitAND($Ret[5], 0x00FF00), BitShift(BitAND($Ret[5], 0x0000FF), -16), BitShift(BitAND($Ret[5], 0xFF0000), 16)))
EndFunc ;==>_WinAPI_GetThemeColor