Кибор » Кибор - Интегрированная среда разработки ботов » Вопросы и решение проблем » Как отследить появление новой информации в текстовом документе?

Страниц (1): [1]
 

1. Martin - 24 Июля, 2022 - 15:48:50 - перейти к сообщению
У меня есть сайт, и если на нем появляются ошибки они добавляются в текстовый блокнот.
log.txt. Как сделать проверку на появление в нем новых данных и сравнить со списком критических ошибок.

Как открыть файл я разобрался но проблема ещё в том, что его вес может достигать больше 200мб и открывать блокнот занимает много времени у моей системы. Мне нужно именно новые данные в блокноте, возможно считывать последние строки не открывая сам файл?
2. Zireael - 24 Июля, 2022 - 16:39:31 - перейти к сообщению
 Цитата:
возможно считывать последние строки не открывая сам файл?

Нет.
 Цитата:
Как отследить появление новой информации в текстовом документе?

Можно проверять размер файла, если изменился значит добавились данные.
Пример, как узнать размер файла:
CODE:
#define FILE_ATTRIBUTE_NORMAL 0x80
#define OPEN_EXISTING 3
#define INVALID_HANDLE_VALUE -1
external(INT, "CreateFile", "CreateFileA", "Kernel32.dll");
external(INT, "GetFileSize", "GetFileSize", "Kernel32.dll");
external(INT, "CloseHandle", "CloseHandle", "Kernel32.dll");


string Path = "C:\log.txt"; // путь к файлу
int hfile=CreateFile(Path, 0, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if(hfile != INVALID_HANDLE_VALUE)
{
int file_size=GetFileSize(hfile, 0); // получить размер файла
CloseHandle(hfile);

messagebox(file_size);
}
else messagebox("Файл не открылся");



Если не принципиально, то для данной задачи лучше использовать PowerShell.
Открыть PowerShell IDE и запустить скрипт:
CODE:
cls
Get-Content 'C:\log.txt' -Wait -Tail 0

Как только в файле появятся новые строки, то они будут выведены в консоль. Можно проверить всё что нужно.
3. Martin - 24 Июля, 2022 - 17:05:43 - перейти к сообщению
 Zireael пишет:
Если не принципиально, то для данной задачи лучше использовать PowerShell.
Открыть PowerShell IDE и запустить скрипт:
считывает крякозябры, не выводит русский текст. Да как мне его сравнить?

 Zireael пишет:
Можно проверять размер файла, если изменился значит добавились данные.

А можно по дате и времени отслеживать? Например проверяет число сегодня, время, находит его в файле и начинает следить?
Или как вы сказали узнав, что размер файла изменился, сразу спуститься на последнюю строку и прочитать её? Но придется всё равно весь файл прочитать?
(Добавление)
Возможно, тогда при первом запуске, прочитать весь файл, узнать сколько там строк,
потом следить за изменением размера файла, и как только он изменился, прочитать данные ниже последней строки, что мы узнали?
4. Zireael - 24 Июля, 2022 - 17:16:19 - перейти к сообщению
 Цитата:
считывает крякозябры, не выводит русский текст.

Нужно кодировку файла указать:
CODE:
Get-Content 'C:\image\log.txt' -Wait -Tail 0 -Encoding UTF8

 Цитата:
Да как мне его сравнить?

С чём нужно сравнить?


Функциями, которые в кибор только весь файл читать.
5. Martin - 24 Июля, 2022 - 17:39:02 - перейти к сообщению
 Zireael пишет:
С чём нужно сравнить?

С текстом. К примеру пишет "Критическая ошибка 321" то выполнить действие 1 , а если "Ошибка 502" то выполнить действе 2 и т.д.
(Добавление)
 Zireael пишет:
Нужно кодировку файла указать:
Спасибо, теперь всё отображает.

 Zireael пишет:
Функциями, которые в кибор только весь файл читать.
Получается нужно искать эти функции в питоне и интегрировать код в кибор?
6. Zireael - 24 Июля, 2022 - 18:10:36 - перейти к сообщению
CODE:
#define SEEK_SET 0
#define FILE_ATTRIBUTE_NORMAL 0x80
#define OPEN_EXISTING 3
#define INVALID_HANDLE_VALUE -1
external(INT, "CreateFile", "CreateFileA", "Kernel32.dll");
external(INT, "GetFileSize", "GetFileSize", "Kernel32.dll");
external(INT, "CloseHandle", "CloseHandle", "Kernel32.dll");
external(INT, "_fseek", "fseek", "msvcrt.dll");
external(INT, "_fopen", "fopen", "msvcrt.dll");
external(INT, "_fclose", "fclose", "msvcrt.dll");
external(INT, "_fread", "fread", "msvcrt.dll");

string Path = "C:\image\log.txt"; // путь к файлу


string NewStr;

loop()
{
string result = Wait(Path, 500); // ждать добавления строк в файл, каждые 500 мсек проверяется размер файла
string text = utf8toansi(result);

messagebox("Новый текст:^r^n^r^n"+text); // добавленный текст

if(regexsearch(1, #NewStr, text, "Критическая ошибка 321"))
{
messagebox("Действие 1");
}
if(regexsearch(1, #NewStr, text, "Ошибка 502"))
{
messagebox("Действие 2");
}
}

error:;


function Wait(string PathToFile, int TimeOut)
{
char c_text[99999];
int FileSize = _GetFileSize(Path);
int FileSizeNew;
loop()
{
FileSizeNew = _GetFileSize(PathToFile);
if(FileSizeNew > FileSize)break;
pause(TimeOut);
}

int file = _fopen(Path, "rb");
if(file != 0)
{
_fseek(file, FileSize, SEEK_SET);
int k = _fread(address(#c_text[0]), 1, FileSizeNew-FileSize, file);
_fclose(file);
}
else
{
messagebox("Файл не открылся");
goto global error;
}
return format(#c_text[0], k);
}


function _GetFileSize(string PathToFile)
{
int file_size = 0;
int hfile=CreateFile(PathToFile, 0, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if(hfile != INVALID_HANDLE_VALUE)
{
file_size=GetFileSize(hfile, 0);
CloseHandle(hfile);
}
else
{
messagebox("Файл не открылся");
goto global error;
}
return file_size;
}
7. Martin - 24 Июля, 2022 - 18:23:29 - перейти к сообщению
Zireael , Сколько я вам должен? Спасибо, всё идеально работает.

Powered by ExBB FM 1.0 Final