1

Тема: AHK: Внесенные изменения в файл

Суть вопроса: У меня есть файл, нужно получить данные которые я внес в этот файл сторонней программой.Я так понимаю сначала надо получить содержимое файла а потом как то сравнить с текущими изменениями файла.Ну вообщем помогите чем сможете.

Как сказал мой дед - Я твой дед

2

Re: AHK: Внесенные изменения в файл

У меня есть файл

Файлы бывают разные - текстовые, бинарные и.т.п.

внес в этот файл сторонней программой

Дописал в конец файла? Или изменения могут затрагивать любую часть.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

3

Re: AHK: Внесенные изменения в файл

serzh82saratov пишет:

У меня есть файл

Файлы бывают разные - текстовые, бинарные и.т.п.

внес в этот файл сторонней программой

Дописал в конец файла? Или изменения могут затрагивать любую часть.

Файл не имеет расширения, но читается блокнотом или другим текстовым редактором.Изменения дописываются в конец файла.

Как сказал мой дед - Я твой дед

4

Re: AHK: Внесенные изменения в файл


FileRead, Text, %FileName%
LastLen := StrLen(Text) 
Return

1::
    FileRead, Text, %FileName%
    MsgBox % SubStr(Text, LastLen+1) 
    LastLen := StrLen(Text)
    Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

5

Re: AHK: Внесенные изменения в файл

serzh82saratov пишет:

FileRead, Text, %FileName%
LastLen := StrLen(Text) 
Return

1::
    FileRead, Text, %FileName%
    MsgBox % SubStr(Text, LastLen+1) 
    LastLen := StrLen(Text)
    Return

Работает, спасибо

Как сказал мой дед - Я твой дед

6

Re: AHK: Внесенные изменения в файл

sergeiplugatyr пишет:
serzh82saratov пишет:

FileRead, Text, %FileName%
LastLen := StrLen(Text) 
Return

1::
    FileRead, Text, %FileName%
    MsgBox % SubStr(Text, LastLen+1) 
    LastLen := StrLen(Text)
    Return

Работает, спасибо

А можете привести пример, когда дописываются данные не в конец файла, а в любую часть?

Как сказал мой дед - Я твой дед

7

Re: AHK: Внесенные изменения в файл

Вы шутите >>> AHK:Удаление конкретной строчки из файла?
И снова вопрос зачем?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

8

Re: AHK: Внесенные изменения в файл

serzh82saratov пишет:

Вы шутите >>> AHK:Удаление конкретной строчки из файла?
И снова вопрос зачем?

И что?Там я спрашивал как удалить строчку из файла, а тут я спрашиваю как узнать какие данные были внесены сторонней программой.

Как сказал мой дед - Я твой дед

9

Re: AHK: Внесенные изменения в файл

Я подумал вы про то, как вставить данные...
Приведите хотя бы конкретный пример.
Если текст не равен предыдущему, а изменения были в нескольких разных строках - то что?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10

Re: AHK: Внесенные изменения в файл

serzh82saratov пишет:

Я подумал вы про то, как вставить данные...
Приведите хотя бы конкретный пример.
Если текст не равен предыдущему, а изменения были в нескольких разных строках - то что?

Ладно, я делаю программу чтобы она следила за файлом hosts, и я хочу чтобы если ты записываешь данные сторонней программой в этот файл, то она бы выдавала какие именно данные были внесены.

Как сказал мой дед - Я твой дед

11

Re: AHK: Внесенные изменения в файл

sergeiplugatyr пишет:

Ладно

Спасибо большое за раскрытие секрета, я никому не расскажу.
Попробуй так:

FileHost = C:\Users\sergey\Desktop\hosts
FileBackUp = %A_ScriptDir%\BackUp
FileRead, LastText, %FileBackUp% ; Перед первым стартом должен быть BackUp файла hosts
Return

1:: ; Проверка изменений
    FileRead, NowFileHost, %FileHost% 
    NewStr := DelStr := ""
    
    Loop, Read, %FileHost%
    {
        If !RegExMatch( LastText, "m`a)^\Q" A_LoopReadLine "\E$") ; Сравнение целых строк
        {
            NewStr .= A_LoopReadLine "`n"
            FileReadLine, ReadLine, %FileBackUp%, %A_Index% ; Если надо знать что изменено или удалено
            DelStr .= ReadLine "`n" ; Если надо знать что изменено или удалено
        }
    }
    
    LastText := NowFileHost
    FileDelete, %FileBackUp%
    FileAppend, %NowFileHost%, %FileBackUp% 
    MsgBox,, Новые строки, % NewStr 
    MsgBox,, Удалённые строки, % DelStr ; Если надо знать что изменено или удалено
    Return
    
; Если надо знать что изменено или удалено,     
; в случае если в итоге строк может стать больше по количеству    
;  в результате смещения старой строки "вниз"     
; из-за возможности записи данных не только в конец файла,    
;  то нужно ещё допилить.
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

12 (изменено: Irbis, 2013-08-13 17:57:24)

Re: AHK: Внесенные изменения в файл

Скрипт показывает, какие строки были удалены и/или добавлены со времени последней проверки.
При этом порядок строк и их расположение в исходных файлах неважны, дубликаты строк тоже не учитываются.
Если файл file2 отсутствует при первом запуске, он будет создан при подтверждении замены.

#NoEnv
file1 = c:\Windows\SYSTEM32\drivers\etc\hosts
file2 = %A_ScriptDir%\hosts.old
Loop 2 {
   Iter := A_Index, Arr%Iter% := []
   Loop, Read, % file%Iter%
      Arr%Iter%.Insert(A_LoopReadLine, "")
}
for Key in Arr1
   Str_add .=  Arr2.HasKey(Key) ? "" : Key . "`n"
for Key in Arr2
   Str_del .=  Arr1.HasKey(Key) ? "" : Key . "`n"
MsgBox % "Добавлено: `n_____________`n`n" . Str_Add . "`n`n"
       . "Убрано: `n_____________`n`n" . Str_Del . "`n"
if (Str_Del || Str_Add) {
   MsgBox,4,, Зафиксировать изменения ?`n`nФайл "%file2%" будет заменен`nфайлом "%file1%"
   IfMsgBox Yes
   {
      FileCopy, %file1%, %file2%,1
         if ErrorLevel
         MsgBox Невозможно скопировать файл.
   }
}
return

Если нужны номера строк с изменениями:

+ Показать
#NoEnv
file1 = c:\Windows\SYSTEM32\drivers\etc\hosts
file2 = %A_ScriptDir%\hosts.old
Loop 2 {
   Iter := A_Index, Arr%Iter% := []
   Loop, Read, % file%Iter%
      Arr%Iter%.Insert(A_LoopReadLine, A_Index)
}
for Key, V in Arr1
   Str_add .=  Arr2.HasKey(Key) ? "" : "строка № " . V . "  -> " . Key . "`n"
for Key, V in Arr2
   Str_del .=  Arr1.HasKey(Key) ? "" : "строка № " . V . " -> " . Key . "`n"
MsgBox % "Добавлено: `n_____________`n`n" . Str_Add . "`n`n"
       . "Убрано: `n_____________`n`n" . Str_Del . "`n"
if (Str_Del || Str_Add) {
   MsgBox,4,, Зафиксировать изменения ?`n`nФайл "%file2%" будет заменен`nфайлом "%file1%"
   IfMsgBox Yes
   {
      FileCopy, %file1%, %file2%,1
         if ErrorLevel
         MsgBox Невозможно скопировать файл.
   }
}
return

13

Re: AHK: Внесенные изменения в файл

Irbis пишет:

Скрипт показывает, какие строки были удалены и/или добавлены со времени последней проверки.
При этом порядок строк и их расположение в исходных файлах неважны, дубликаты строк тоже не учитываются.
Если файл file2 отсутствует при первом запуске, он будет создан при подтверждении замены.

#NoEnv
file1 = c:\Windows\SYSTEM32\drivers\etc\hosts
file2 = %A_ScriptDir%\hosts.old
Loop 2 {
   Iter := A_Index, Arr%Iter% := []
   Loop, Read, % file%Iter%
      Arr%Iter%.Insert(A_LoopReadLine, "")
}
for Key in Arr1
   Str_add .=  Arr2.HasKey(Key) ? "" : Key . "`n"
for Key in Arr2
   Str_del .=  Arr1.HasKey(Key) ? "" : Key . "`n"
MsgBox % "Добавлено: `n_____________`n`n" . Str_Add . "`n`n"
       . "Убрано: `n_____________`n`n" . Str_Del . "`n"
if (Str_Del || Str_Add) {
   MsgBox,4,, Зафиксировать изменения ?`n`nФайл "%file2%" будет заменен`nфайлом "%file1%"
   IfMsgBox Yes
      FileCopy, %file1%, %file2%,1
}
return

Если нужны номера строк с изменениями:

+ Показать
#NoEnv
file1 = c:\Windows\SYSTEM32\drivers\etc\hosts
file2 = %A_ScriptDir%\hosts.old
Loop 2 {
   Iter := A_Index, Arr%Iter% := []
   Loop, Read, % file%Iter%
      Arr%Iter%.Insert(A_LoopReadLine, A_Index)
}
for Key, V in Arr1
   Str_add .=  Arr2.HasKey(Key) ? "" : "строка № " . V . "  -> " . Key . "`n"
for Key, V in Arr2
   Str_del .=  Arr1.HasKey(Key) ? "" : "строка № " . V . " -> " . Key . "`n"
MsgBox % "Добавлено: `n_____________`n`n" . Str_Add . "`n`n"
       . "Убрано: `n_____________`n`n" . Str_Del . "`n"
if (Str_Del || Str_Add) {
   MsgBox,4,, Зафиксировать изменения ?`n`nФайл "%file2%" будет заменен`nфайлом "%file1%"
   IfMsgBox Yes
      FileCopy, %file1%, %file2%,1
}
return

Работает, а вот как сделать чтобы он перезаписывал данные, этот код запоминает данные которые я вводил ранее.Можно как то сделать чтобы она обновляла свои данные, и при нахождении какой либо строчки которую я вписал в файл hosts, выдавала именно то что я ввел в данное время.Надеюсь суть вы поняли.

Как сказал мой дед - Я твой дед

14

Re: AHK: Внесенные изменения в файл

Понял, что нужно еще что-то сверх того, что написано в первом посте.
Что значит "выдавала именно то что я ввел в данное время"? То есть данные отредактированы в редакторе, но файл не сохранен, или что-то другое?

15

Re: AHK: Внесенные изменения в файл

Irbis пишет:

Понял, что нужно еще что-то сверх того, что написано в первом посте.
Что значит "выдавала именно то что я ввел в данное время"? То есть данные отредактированы в редакторе, но файл не сохранен, или что-то другое?

Объясню по другому, я например вписываю строку в файл hosts: 123, скрипт мне выдает что я ввел 123, но когда я ввожу еще раз на следующую строчку например 321, то он мне выдает что я добавил 123 и ниже 321.То есть я хочу чтобы он выдавал мне строчку которую я ввел в данный момент, а так он просто запоминает те строчки которые я вводил ранее и выдает их мне в сообщении.

Как сказал мой дед - Я твой дед

16

Re: AHK: Внесенные изменения в файл

После показа измененых строк появляется диалог с запросом: "Зафиксировать изменения?" и двумя вариантами ответа.
Нажми "Да" и запусти скрипт еще раз.

Я внес изменения в пост #12, чтобы в случае невозможности копирования обновленного файла hosts, скрипт сообщал бы об ошибке. Это может быть, если скрипту не хватает прав для копирования файла в папку, откуда он запущен, например из папки с ОС.

17

Re: AHK: Внесенные изменения в файл

Irbis пишет:

После показа измененых строк появляется диалог с запросом: "Зафиксировать изменения?" и двумя вариантами ответа.
Нажми "Да" и запусти скрипт еще раз.

Я внес изменения в пост #12, чтобы в случае невозможности копирования обновленного файла hosts, скрипт сообщал бы об ошибке. Это может быть, если скрипту не хватает прав для копирования файла в папку, откуда он запущен, например из папки с ОС.

Проблема в том что нужно постоянно перезапускать скрипт, тогда он будет работать исправно, а мне нужно чтобы он как то обновлялся чтобы можно было обойтись без перезапуска скрипта.

Как сказал мой дед - Я твой дед

18 (изменено: Irbis, 2013-08-14 15:38:43)

Re: AHK: Внесенные изменения в файл

#NoEnv
#Persistent
file1 = c:\Windows\SYSTEM32\drivers\etc\hosts
file2 = %A_ScriptDir%\hosts.old
IfNotExist, %file2%    
   FileCopy, %file1%, %file2%,1
if ErrorLevel {
   MsgBox Невозможно скопировать файл.
   ExitApp
}
SetTimer, Check, 10000 ; 10 секунд
Return

Check:
   FileGetTime, time1, %file1%
   FileGetTime, time2, %file2%
   if (time1 = time2)
      Return
   Loop 2 {
      J := A_Index, Arr%J% := []
      Loop, Read, % file%J%
         Arr%J%.Insert(A_LoopReadLine . "`n", "")
   }
   loop 2 {
      A:=3-A_Index
      Str_%A% =
      for Key in Arr%A_Index%
         Str_%A% .=  Arr%A%.HasKey(Key) ? "" : Key
   }
   if (Str_2 || Str_1) {
      MsgBox % "Добавлено: `n_____________`n`n" . Str_2 . "`n`n"
             . "Убрано: `n_____________`n`n" . Str_1 . "`n"
   }
   FileCopy, %file1%, %file2%, 1
   if ErrorLevel {
      MsgBox Невозможно скопировать файл.
      ExitApp
   }
Return

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

19

Re: AHK: Внесенные изменения в файл

Irbis пишет:
#NoEnv
#Persistent
file1 = c:\Windows\SYSTEM32\drivers\etc\hosts
file2 = %A_ScriptDir%\hosts.old
IfNotExist, %file2%    
   FileCopy, %file1%, %file2%,1
if ErrorLevel {
   MsgBox Невозможно скопировать файл.
   ExitApp
}
SetTimer, Check, 10000 ; 10 секунд
Return

Check:
   FileGetTime, time1, %file1%
   FileGetTime, time2, %file2%
   if (time1 = time2)
      Return
   Loop 2 {
      J := A_Index, Arr%J% := []
      Loop, Read, % file%J%
         Arr%J%.Insert(A_LoopReadLine . "`n", "")
   }
   loop 2 {
      A:=3-A_Index
      Str_%A% =
      for Key in Arr%A_Index%
         Str_%A% .=  Arr%A%.HasKey(Key) ? "" : Key
   }
   if (Str_2 || Str_1) {
      MsgBox % "Добавлено: `n_____________`n`n" . Str_2 . "`n`n"
             . "Убрано: `n_____________`n`n" . Str_1 . "`n"
   }
   FileCopy, %file1%, %file2%, 1
   if ErrorLevel {
      MsgBox Невозможно скопировать файл.
      ExitApp
   }
Return

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

Прям то что нужно, спасибо вам.

Как сказал мой дед - Я твой дед

20

Re: AHK: Внесенные изменения в файл

sergeiplugatyr, избегайте бесполезного цитирования предыдущего поста. У нас есть кнопочка "Ответить".

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

21

Re: AHK: Внесенные изменения в файл

Пожалуйста