Что нового

Создание копий файла через определенный промежуток времени.

amorphyc

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

Описание: Здравствуйте, гуру AutoIt! Снова хочу попросить помощи!
Суть такова: есть файл, который постоянно, с некоторой периодичностью (5-10 минут) перезаписывается с изменениями.
Возможно ли создать скрипт, который будет каждые, скажем, 10 минут сохранять в папку копии этого файла. Допустим, с именами file_01.sav, file_02.sav и так далее, или просто со временем в названии, когда была запись, чтоб всегда можно было достать этот файл таким, каким он был раньше. И пусть все эти копии файла хранятся себе в папке.
Для полного понимания - это файл сохранения игры, игра его постоянно перезаписывает без возможности отката назад.

Примечания:
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
amorphyc [?]
просто со временем в названии, когда была запись
Формат времени: YYYYMMDDHHMMSS
Код:
$Path = "C:\Новая папка\" ; путь к файлу
$Name = "Имя файла"       ; имя файла
$Ext  = ".sav"            ; расширение
$Msec = 60000             ; частота опроса

Global $CurTime, $OldTime, $FullName = $Path & $Name & $Ext
While Sleep($Msec)
  If Not FileExists($FullName) Then ContinueLoop
  $CurTime = FileGetTime($FullName, 0, 1)
  If $OldTime <> $CurTime Then
    FileCopy($FullName, $Path & $CurTime & $Ext)
    $OldTime = $CurTime
  EndIf
WEnd
 
Автор
A

amorphyc

Новичок
Сообщения
45
Репутация
0
Пока не получается ни запустить, ни скомпилировать в экзешник. (
 

Вложения

  • 2018_09_07 5_58 Office Lens~01.jpg
    2018_09_07 5_58 Office Lens~01.jpg
    188.1 КБ · Просмотры: 18

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Указывает на ошибку оператора присваивания с пустым описанием самой ошибки :stars:
Попробуйте отключить антивирус или переустановите AutoIt.
 
Автор
A

amorphyc

Новичок
Сообщения
45
Репутация
0
Антивируса нет, программу установил самую последнюю, пробовал с другими папками, отключал скрытие папки, результат тот же. При компилировании - ошибка пустая, при запуске скрипта - ошибка "Unable to parse line"
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Запустить в редакторе и посмотреть ошибку
 
Автор
A

amorphyc

Новичок
Сообщения
45
Репутация
0
Спасибо за совет! В редакторе проверил, нашел причину ошибок - все пробелы как-то заменились на символ В. Поправил, теперь ошибок нет.
Скрипт компилится, запускается, но работы его совсем не видно. ( Что ж с ним такое-то...
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
тебе дали пример. теперь подставь свои пути что и куда копировать
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
amorphyc [?]
работы его совсем не видно
Данный скрипт раз в минуту ($Msec = 60000) проверяет время изменения файла "$Path & $Name & $Ext" (подставьте свои значения). Если время изменилось (относительно предыдущей проверки), то в папке $Path создаётся копия файла с временем изменения в качестве имени (в формате YYYYMMDDHHMMSS) и с расширением $Ext.

Например, для файла "C:\Новая папка\Имя файла.sav" будут созданы копии
"C:\Новая папка\20180907190731.sav"
"C:\Новая папка\20180907191711.sav"
"C:\Новая папка\20180907192347.sav" и т.д.
Но, ещё раз повторю, исходный файл "C:\Новая папка\Имя файла.sav" должен быть перезаписан, т.е. должно измениться его время модификации.
 
Автор
A

amorphyc

Новичок
Сообщения
45
Репутация
0
Делаю именно это, но хоть убейте, ничего не добавляется. Уже и скриптом, и экзешником, и в эту же папку кладу, и в любую другую - нет никаких новых файлов. Короче, меня выбесило.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
amorphyc
Если вы ПРАВИЛЬНО указали путь к файлу, то после первой минуты в той же папке должна появиться первая копия, т.к. при запуске время нулевое.

Хорошо. Давайте добавим отладки.
1. Если файл не найден, появится сообщение.
2. В папке $Path будет создан log.txt, в который при каждой проверке будет записана информация о текущем и предыдущем времени, а также ошибка при копировании файла. Посмотрите этот лог и сделайте вывод о наличии изменений времени
Код:
$Path = "C:\Новая папка\" ; путь к файлу
$Name = "Имя файла"       ; имя файла
$Ext  = ".sav"            ; расширение
$Msec = 5000              ; частота опроса

; ----------------------- ;

Global $CurTime, $OldTime, $FullName = $Path & $Name & $Ext
FileDelete($Path & "log.txt") ; отладка
While Sleep($Msec)
  If Not FileExists($FullName) Then
    MsgBox(262144, "", "Файл не найден: " & $FullName) ; отладка
    ContinueLoop
  EndIf
  $CurTime = FileGetTime($FullName, 0, 1)
  FileWriteLine($Path & "log.txt", "Текущее время   : " & $CurTime & @CRLF & "Предыдущее время: " & $OldTime) ; отладка
  If $OldTime <> $CurTime Then
    FileCopy($FullName, $Path & $CurTime & $Ext)
    FileWriteLine($Path & "log.txt", "Файл скопирован. Ошибка: " & @error) ; отладка
    $OldTime = $CurTime
  EndIf
WEnd
 
Автор
A

amorphyc

Новичок
Сообщения
45
Репутация
0
Уважаемый Inni, если я пробую это сделать просто с тестовым файлом, на другом диске - всё получается! Но именно с нужным файлом в нужной папке - ноль результата! Возможно дело в пути к файлу "C:\Users\юзернейм\AppData\Local\AVGame\Saved\Savegames\". Путь копирую из строки проводника. Проверяю файл на время изменения - меняется. А результата нет, к сожалению.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
amorphyc
В логе время меняется?


Добавлено:
Сообщение автоматически объединено:

Вот альтернатива. Через каждые $Msec миллисекунд должна тупо создаваться копия файла с ТЕКУЩИМИ датой и временем в качестве имени
Код:
$Path = "C:\Новая папка\" ; путь к файлу
$Name = "Имя файла"       ; имя файла
$Ext  = ".sav"            ; расширение
$Msec = 60000             ; интервал создания копий

; ----------------------- ;

$FullName = $Path & $Name & $Ext
While Sleep($Msec)
  If Not FileExists($FullName) Then
    MsgBox(262144, "", "Файл не найден: " & $FullName)
    ContinueLoop
  EndIf
  If Not FileCopy($FullName, $Path & @YEAR & @MON & @MDAY & "_" & @HOUR & @MIN & @SEC & $Ext) Then MsgBox(262144, "", "Ошибка копирования")
WEnd
 
Автор
A

amorphyc

Новичок
Сообщения
45
Репутация
0
УРРРААА!!! Я нашёл, наконец, ошибку! :laugh:
В первом примере в середине кода пропущено "EndIf", добавил, всё заработало!
Спасибо вам, уважаемые мастера, Вы очень помогли ! )
В принципе, тема решена, но если ещё немного поможете с удобностями - буду очень благодарен! )
1. Будет удобней сохранять файла не сюда же, а в отдельную папку, чтоб не путались с другими игровых файлами.
2. Если можно, то заменить в пути к папке "Имя Пользователя" на универсальный путь. Чтоб и другими людям можно было пользоваться готовы экзешником.
Сам тоже буду пытаться ковырять, но я вообще дремучий в этом.
 
Автор
A

amorphyc

Новичок
Сообщения
45
Репутация
0
После строки "ContinueLoop"
В следующем примере, который с отладкой, всё есть, и редактор ругался при проверке синтаксиса. Я сравнил оба кода и нашёл. Теперь всё отлично работает.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
amorphyc [?]
После строки "ContinueLoop"
Изучайте синтаксис: при однострочной записи условного оператора добавлять EndIf не нужно.
Если вы редактируете проверенный и полностью рабочий код, не до конца понимая, что делаете, то разработчик за это ответственности не несёт ;)
 
Автор
A

amorphyc

Новичок
Сообщения
45
Репутация
0
Уважаемый InnI, я полагался ТОЛЬКО на проверку синтаксиса самим встроенным редактором и на сравнивание двух показаных мне кодов. А сам я абсолютно не разбираюсь в этом, к глубокому моему сожалению.
И тем не менее с вашими советами и помощью всё решилось! Огромное вам всем спасибо, уважаемые Гуру! :smile:
 
Автор
A

amorphyc

Новичок
Сообщения
45
Репутация
0
Ещё раз всем здравствуйте, друзья!
Подогнал под личные хотелки предоставленный пример, теперь путь к файлу - универсальный, подойдёт любому пользователю, сохранения лежат в отдельной папке, формат имени более понятный и удобночитаемый, когда создаётся папка - выводится уведомление.
Вроде всё работает, проверку на синтаксис проходит, но вдруг можно как-то улучшить?
Посмотрите, будьте добры! Скажите свой вердикт. :-\
Код:
$Path = @UserProfileDir & "\AppData\Local\AVGame\Saved\SaveGames\"
$Name = "gamesave_slot0"
$Ext = ".sav"
$Msec = 300000

If Not FileExists(@UserProfileDir & "\AppData\Local\AVGame\Saved\SaveGames\Saves\") Then
DirCreate(@UserProfileDir & "\AppData\Local\AVGame\Saved\SaveGames\Saves\")
   MsgBox(0,"", "Папка сохранений создана.")
   EndIf
Global $CurTime, $OldTime, $FullName = $Path & $Name & $Ext
While Sleep($Msec)
   If Not FileExists($FullName) Then
ContinueLoop
EndIf
   $CurTime = FileGetTime($FullName, 0, 1)
   If $OldTime <> $CurTime Then
	  FileCopy($FullName, $Path & "Saves\" & @YEAR & "." &@MON & "." & @MDAY & "_" & @HOUR & "." & @MIN  & $Ext)
	  $OldTime = $CurTime
   EndIf
WEnd
 
Верх