Zireael |
Отправлено: 25 Июля, 2022 - 00:39:31
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: возможно считывать последние строки не открывая сам файл?
Нет.
Цитата: Как отследить появление новой информации в текстовом документе?
Можно проверять размер файла, если изменился значит добавились данные.
Пример, как узнать размер файла:
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
Как только в файле появятся новые строки, то они будут выведены в консоль. Можно проверить всё что нужно. |
|
|
Martin |
Отправлено: 25 Июля, 2022 - 01:05:43
|
Мастер
Покинул форум
Сообщений всего: 121
Дата рег-ции: Июнь 2022
Репутация: 1
|
Zireael пишет: Если не принципиально, то для данной задачи лучше использовать PowerShell.
Открыть PowerShell IDE и запустить скрипт: считывает крякозябры, не выводит русский текст. Да как мне его сравнить?
Zireael пишет: Можно проверять размер файла, если изменился значит добавились данные.
А можно по дате и времени отслеживать? Например проверяет число сегодня, время, находит его в файле и начинает следить?
Или как вы сказали узнав, что размер файла изменился, сразу спуститься на последнюю строку и прочитать её? Но придется всё равно весь файл прочитать?
(Добавление)
Возможно, тогда при первом запуске, прочитать весь файл, узнать сколько там строк,
потом следить за изменением размера файла, и как только он изменился, прочитать данные ниже последней строки, что мы узнали? |
|
|
Zireael |
Отправлено: 25 Июля, 2022 - 01:16:19
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: считывает крякозябры, не выводит русский текст.
Нужно кодировку файла указать:
CODE:Get-Content 'C:\image\log.txt' -Wait -Tail 0 -Encoding UTF8
Цитата: Да как мне его сравнить?
С чём нужно сравнить?
Функциями, которые в кибор только весь файл читать. |
|
|
Martin |
Отправлено: 25 Июля, 2022 - 01:39:02
|
Мастер
Покинул форум
Сообщений всего: 121
Дата рег-ции: Июнь 2022
Репутация: 1
|
Zireael пишет: С чём нужно сравнить?
С текстом. К примеру пишет "Критическая ошибка 321" то выполнить действие 1 , а если "Ошибка 502" то выполнить действе 2 и т.д.
(Добавление)
Zireael пишет: Нужно кодировку файла указать:
Спасибо, теперь всё отображает.
Zireael пишет: Функциями, которые в кибор только весь файл читать.
Получается нужно искать эти функции в питоне и интегрировать код в кибор? |
|
|
Zireael |
Отправлено: 25 Июля, 2022 - 02:10:36
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
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;
} |
|
|
|