Тема: AHK: Как сделать проверку текстового файла на изменение содержимого?
Здравствуйте, мне нужно сделать проверку файла на изменение текста в нем, и если текст изменился/добавился/удалился, то проигрываются последующие действия.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Серый форум → Общение → AutoHotkey → AHK: Как сделать проверку текстового файла на изменение содержимого?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Здравствуйте, мне нужно сделать проверку файла на изменение текста в нем, и если текст изменился/добавился/удалился, то проигрываются последующие действия.
Изучайте команду
FileGetTimeПоясню, файл обновляется чуть ли не каждую секунду, и мне надо всего лишь высвечивать его содержимое в окне, и если файл обновляется - обновить проекцию в окно. Вы скажете, что можно просто поставить обновление проекции через каждую секунду. Но я хочу обновлять проекцию минимальное количество раз, только тогда, когда файл дополнился
Captain_SERG, вот здесь этот вопрос рассматривался.
FileRead, OutputVar1, FileName.txt
GUI, Add, Text, ReadOnly vMyTime, %A_Hour%:%A_Min%:%A_Sec%
GUI, Color, FFFFFF
GUI, Add, Text, vMyText, %OutputVar1%
GUI, Show, w640 h680
Loop
{
FileRead, OutputVar2, FileName.txt
If OutputVar2 != %OutputVar1%
{
GuiControl, , MyTime, %A_Hour%:%A_Min%:%A_Sec%
OutputVar1 = %OutputVar2%
GuiControl, , MyText, %OutputVar2%
GUI, Color, FFFF99
Sleep, 600
GUI, Color, FFFFFF
}
Sleep, 2000
}GUI, Add, Text, vMyText, %OutputVar1%
А если там текста на пару мегабайт? ![]()
Кстати текста там не мало, и мне надо чтобы текст отображался с нижней строчки и шел вверх.
На этой картинке показано как именно должно все выглядеть
Проверяй размер.
А какая разница, сколько мегабайт? В любом случае файл нужно полностью считывать. GUI прикрутил для наглядности.
А чем тут предложенный FileGetTime неподходит?
В общем автор пошёл сложным путём. Файл может иметь большой размер и изменяться несколько раз в секунду. При этом никаких специальных уведомлений не поступает.
Ладно, давайте проще: мне нужно чтобы большой файл файл text.txt читался каждую секунду и проецировал текст начиная с нижней строчки в GUI окно
Ок, сделаем 2 предположения:
- Изменения в файле происходят добавлением строк в конец файла, причем строка заканчивается переводом (`r`n) ;
- Кодировка файла ANSI, т.е. 1 байт на символ.
Содержимое файла выводим через GUI, предложенный ypppu:
filename = c:\log.txt
lines := 5
GUI, Add, Text, ReadOnly vMyTime, %A_Hour%:%A_Min%:%A_Sec%
GUI, Color, FFFFFF
GUI, Add, Text, vMyText w640 R%lines%, %Content%
GUI, Show
FileGetSize, oldsize, %filename%
newsize := 0
Loop, read, %filename%
{
newsize += StrLen(A_LoopReadLine)+2 ; ANSI + `r`n
Content .= A_LoopReadLine . "`n"
Content := SubStr(Content, InStr(Content, "`n",0,-1, lines)+1)
if (oldsize = newsize)
{
GuiControl, , MyTime, %A_Hour%:%A_Min%:%A_Sec%
GuiControl, , MyText, %Content%
GUI, Color, FFFF99
Sleep, 600
GUI, Color, FFFFFF
}
while oldsize = newsize
{
sleep 1000
FileGetSize, oldsize, %filename%
}
}
GuiClose:
Gui, Destroy
if !oldsize
MsgBox Ошибка чтения, или файл "%filename%" не найден!
ExitAppЯ думаю, алгоритм понятен - по достижении конца файла читать по одной строке, сверяя размер файла с количеством прочитанного.
Irbis, как-то странно он работает. Указал путь к нужному файлу - скрипт не включался. указал путь к файлу поменьше (1 строчка) - включился, и 1 раз засек изменение в нем. После выключился и больше не включался
Значит, файл не подходит под один из критериев, которые я написал ранее (или под оба), и нужен другой подход.
На тестовом файле в блокноте все работает и новые строки оперативно отображаются. То есть:
11<Enter><Сохранить>
222<Enter><Сохранить>
333<Enter><Сохранить> и т.д.
После каждого <Сохранить> новая строка добавляется в окно GUI.
А какие там критерии? Я не умею читать такие сложные коды ![]()
Я написал, что в подопытном файле должен быть 1 байт на 1 символ (не юникод), и строки добавляются вместе с символами переноса строки.

Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться