Каким представляется алгоритм работы синхронизации:
- MLO отслеживает изменения локального файла и отражает их в файле на удаленном ПК/FTP/Облаке;
- MLO отслеживает изменения файла на удаленном ПК/FTP/Облаке и переносит их в локальный файл.
Я попытался реализовать такой сценарий с помощью скрипта Autohotkey. Работает он следующим образом: через 5 минут после запуска компьютера (включение или выход из ждущего/спящего режима) выполняется синхронизация, затем отслеживается сохранение (т. е. запись на диск) файла с данными. Если было сохранение - запускается процедура синхронизации.
Скрипт прилагается, для работы нужен Autohotkey http://www.autohotkey.com/
Код: Выделить всё
; based on: http://www.autohotkey.com/forum/topic7213.html
; http://www.autohotkey.com/forum/topic21697.html
#Persistent
OnExit, HandleExit
MLO_EXE_PATH := "D:\opt\MLO\mlo.exe"
MLO_DATA_PATH := "D:\opt\MLO\mymlo"
MLO_DATA_FILE := "mlo.ml"
TIMEOUT_INTERVAL := 500 ; ms
SYNC_INTERVAL := 5*60*1000 ; ms
counter := 0
pwr_event := 1
; Listen to the Windows power event "WM_POWERBROADCAST" (ID: 0x218):
OnMessage(0x218, "func_WM_POWERBROADCAST")
handle := DllCall( "FindFirstChangeNotification", "str", MLO_DATA_PATH, "int", 0, "uint", 0x10 )
if ( ErrorLevel or handle = -1 )
{
MsgBox, [FindFirstChangeNotification] failed: EL = %ErrorLevel% ~ handle = %handle%
return
}
loop {
result := DllCall( "WaitForSingleObject", "uint", handle, "uint", TIMEOUT_INTERVAL )
if(result = 0) ; WAIT_IO_COMPLETION
{
;MsgBox, change has been detected: LAST_WRITE
mlo_quicksync()
} else if (result = 0x102) ; WAIT_TIMEOUT
{
if(pwr_event != 0)
{
counter += 1
if (counter = SYNC_INTERVAL/TIMEOUT_INTERVAL)
{
counter = 0
pwr_event = 0
mlo_quicksync()
}
}
} else if (result = 0xffffffff) ; WAIT_FAILED
{
MsgBox, [WaitForSingleObject] failed: EL = %ErrorLevel% ~ result = %result%
return
}
DllCall( "FindNextChangeNotification", "uint", handle )
}
return
HandleExit:
DllCall( "FindCloseChangeNotification", "uint", handle )
ExitApp
mlo_quicksync()
{
global
RunWait, %MLO_EXE_PATH% %MLO_DATA_PATH%\%MLO_DATA_FILE% -quicksync -console
}
func_WM_POWERBROADCAST(wParam, lParam)
{
global
; PBT_APMRESUMESUSPEND oder PBT_APMRESUMESTANDBY? -> System wakes up
If (wParam = 7 OR wParam = 8)
pwr_event = 1
}