Что нового

Копирование только изменившихся файлов

dr.room

Новичок
Сообщения
283
Репутация
0
AutoIt Version: 3.3.14.3

Всем привет!
Можно ли с помощью AutoIt копировать файлы из папки 1 в папку, 2 при условии что файлы в папке 1 изменились.? Т.е. копирование предполагает условие, которое может уменьшить объемы копирования и избежать избыточного дублирования.
Если можно, напишите пример пожалуйста.
Спасибо

Как основа , наверное может быть такой вариант (правда без проверки изменений)
Код:
$put = "Резерв\" & @MDAY & "." & @MON & "." & @YEAR & "_" & @HOUR & "." & @MIN
DirCreate($put)
FileCopy(@ScriptDir & "\*.txt\", $put, 8)
 
Последнее редактирование:

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Можно сохранить дату и размер файлов и сравнивать, какой из этих параметров изменился.
 

All2khoff

Продвинутый
Сообщения
351
Репутация
65
Как вариант, дата изменения файлов меньше текущей в пределах 24 часов.

Код:
#include <File.au3>
#include <WinApi.au3>
#include <Date.au3>

While - 1
   $sOldDate = _NowCalc() ; Текущая дата и время
   $sNewDate = _DateAdd('d', -1, $sOldDate) ; Новая дата и время "- 1 день"
;~    ConsoleWrite($sOldDate& @CRLF)
;~    ConsoleWrite($sNewDate& @CRLF)
   $sOldDate = StringReplace ($sOldDate, "/", "")    ;убираем разделители
   $sOldDate = StringReplace ($sOldDate, " ", "")
   $sOldDate = StringReplace ($sOldDate, ":", "")
;~    ConsoleWrite ($sOldDate& " очищено"& @CRLF)
   $sNewDate = StringReplace ($sNewDate, "/", "")
   $sNewDate = StringReplace ($sNewDate, " ", "")
   $sNewDate = StringReplace ($sNewDate, ":", "")
;~    ConsoleWrite ($sNewDate& " очищено"& @CRLF)

   $put = "Резерв\" & @MDAY & "." & @MON & "." & @YEAR & "_" & @HOUR & "." & @MIN
   Checkdata()
   Sleep(60000) ; 1 минута паузы
WEnd

Func Checkdata()
   $aFiles = _FileListToArray(@ScriptDir, "*.docx", 1, True)    ;поиск файла по расширению и сохранение их в массив
   If @error Then Exit                                         ;"Ошибка поиска файлов")
      ;~    ConsoleWrite("Найдено файлов " & $aFiles[0] & @CRLF) ; <== отладка
   For $i = 1 To $aFiles[0]                        ;счетчик файлов
      $D = FileGetTime($aFiles[$i], 0, 1)            ;получаем дату файла
      ;~   ConsoleWrite($aFiles[$i] & "|" & @CRLF & $D & @CRLF) ; <== отладка
      If $D < $sOldDate And $D > $sNewDate Then rezerv($aFiles[$i])    ;сравнение дат
         Next
EndFunc   ;==>Rezerv

Func rezerv($file)
    DirCreate($put)
    FileCopy($file, $put, 8)                            ;копирование файлов
    TrayTip("Всё ок", "Проведено резервирование"& $file& @CRLF, -1, 1) ;отчет по каждому файлу
    Sleep(3000)
EndFunc

Вам осталось определиться как часто делать бэкап. и настроить соответствующий диапазон дат или времени.

Если же вам нужно оперативно отслеживать и вести историю версий файлов в течении определенного промежутка времени, то это в принципе тоже выполнимо как предложил уважаемый AZJIO сохраняя статусы документов, но это уже не будет похоже на попытку избежать избыточное дублирование)
 
Последнее редактирование:
Автор
D

dr.room

Новичок
Сообщения
283
Репутация
0
Можно сохранить дату и размер файлов и сравнивать
Идея понятна. А как реализовать?
Сообщение автоматически объединено:

Как вариант, дата изменения файлов меньше текущей в пределах 24 часов.
Насколько я понял, скрипт узнает дату. Не понял как дальше этот параметр учитывается?
На практике скрипт просто каждую минуту резервирует один и тот же файл, без учета изменений. А нужно с учетом
 
Последнее редактирование:

All2khoff

Продвинутый
Сообщения
351
Репутация
65
Идея понятна. А как реализовать?
например через ini-файл, сохраняем имя файла = дата изменения
Еслиданные разнятся сделать бэкап и обновить данные в ini-файле
На практике скрипт просто каждую минуту резервирует один и тот же файл,
Да так и есть, так как вы не дали никаких временных рамок как часто делать бэкап, то я сделал каждую минуту для отладки, но этот скрипт не совсем подходит для оперативного резервирования, а скорее для бэкапа изменившихся фалов за сутки.
 
Последнее редактирование:

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
А как реализовать?
Смотрите у меня в подписи программы, там есть "Синхронизация файлов", исходники в комплекте.
Код:
$filename1 = "C:\file1"
$filename2 = "C:\file2"

While 1
	Sleep(60000)
	If FileGetSize($filename1) <> FileGetSize($filename2) Or FileGetTime($filename1, 0, 1) <> FileGetTime($filename2, 0, 1) Then
		If FileCopy($filename1, $filename2) = 0 Then
			MsgBox(0, "Ошибка", "Не удалось скопировать файл")
		EndIf
	EndIf
WEnd
 
Последнее редактирование:
Верх