Что нового

Синхронизация 2 папок.

ZanMax

Тестер
Сообщения
120
Репутация
5
Всем привет.
Возникла задача синхронизировать 2 папки.
в папке 10 файлов по 5 - 30 ГБ.
Каздую ноч создаеться еще один файл.(резервное копирование)
Помогите синхронизировать 2 папки.
Тоесть нужен скрипт который будет проверять появилось ли что-то новое если да то копировать.
Спасибо большое.
 

AZJIO

Меценат
Меценат
Сообщения
2,757
Репутация
1,151
ZanMax
Для этого нужен обычный скрипт поиска файлов. При старте он находит файл и проверяет есть ли такой же файл в папке синхронизации, если есть то едем дальше, если нет, то копируем.
У меня подобный скрипт "Compare (сравнение каталогов).au3", попробуй из него сделать.

Код:
#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
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
AZJIO сказал(а):
Для этого нужен обычный скрипт поиска файлов. При старте он находит файл и проверяет есть ли такой же файл в папке синхронизации, если есть то едем дальше, если нет, то копируем.

Синхронизация, это еще и сравнение дат создания файлов.
 

AZJIO

Меценат
Меценат
Сообщения
2,757
Репутация
1,151
Yashied
В общем ждём точного ответа, как я понял - резервное копирование, т.е. дополнять один каталог новыми файлами. Если требуется замена, и если два каталога обновляются независимо, то можно добавить FileGetTime и двойную проверку. Первая сравнивает каталоги 1-ый со 2-ым, вторая проверка 2-го с 1-ым.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
622
OffTopic:
хм... надеюсь сюда заглянет snoitaleR, у него кажись уже есть готовый скрипт для "умной" синхронизации. по крайней мере достаточно живо обсуждалось на конференции
 
Верх