Здравствуйте всем,
какими средствами, методами, способами можно в реальном времени отслеживать изменения в текстовом файле?
Есть программа, которая пишет логи в текстовый файл. Мне из моей софтины. надо отслеживать записи в этот файл..
Модератор: Модераторы
Sharfik писал(а):У каждого файла есть Дата/Время создания и изменения. Проверяешь дату изменения и запоминаешь ее. Потом сравниваешь читал ты этот файл или нет.
arriah писал(а):надо в реальном времени отслеживать появление записи в файле, она может появится через 10 секунд, а может и через 5 минут...
Vadim писал(а):Ну дак и настройте диапазон проверки даты-времени изменения файла на то время, которое считаете необходимым. Если файл не слишком большой, то его можно грузить в TStringList, запоминая кол-во строк. При следующей загрузке те строки, что окажутся больше прошлого запоминаяния и будут новыми.
arriah писал(а):Это понятно, но меня это не устраивает - надо в реальном времени отслеживать появление записи в файле, она может появится через 10 секунд, а может и через 5 минут...
Вобщем нужен типа аналога юниксовой команды tail -f
Sharfik писал(а):В реальном времени, это в реальном времени - проверять по времени каждую секунду/минуту
А выводить конец файла, это выводить конец файла - за уши притянутая правда.
MonFilesThread = class (TThread)
protected
procedure Execute; override;
public
procedure LogUpdate;
Constructor Create (CreateSuspended: boolean);
private
end;
constructor MonFilesThread.Create(CreateSuspended:boolean);
begin
FreeOnTerminate:=True;
inherited Create(CreateSuspended);
end;
Procedure MonFilesThread.Execute;
var
FilesChange: THandle;
begin
FilesChange := FindFirstChangeNotification(
PChar('test.txt'), //имя файла
false, //не проверяем подкаталоги
FILE_NOTIFY_CHANGE_FILE_NAME+ //создание файла
FILE_NOTIFY_CHANGE_LAST_WRITE); //изменение времени последней записи в файл
try
while not Terminated do
begin
case WaitForSingleObject(FilesChange,1000) of
WAIT_FAILED: Terminate; //Ошибка, завершаем поток
WAIT_OBJECT_0: Synchronize(@LogUpdate); //вызов процедуры обработки файла
end;
FindNextChangeNotification(FilesChange);
end;
finally
FindCloseChangeNotification(FilesChange);
end;
end;
Procedure MonFilesThread.LogUpdate;
Begin
Memo1.Lines.LoadFromFile('test.txt');
end;
procedure TForm1.Button1Click(Sender: TObject);
var
StartMonFiles:MonFilesThread;
begin
Memo1.Clear;
if FileExists('test.txt') then Memo1.Lines.LoadFromFile('test.txt');
StartMonFiles:=MonFilesThread.Create(True);
StartMonFiles.Start;
end;
Компиляция проекта, цель: mytread.exe: Код завершения 1, ошибок: 1
unit1.pas(62,3) Error: Identifier not found "Memo1"
arriah писал(а):Но как же тогда ФАР его читает?
Лекс Айрин писал(а):notepad++
procedure TForm1.Button2Click(Sender: TObject);
Var
FMemory:TMomoryStream;
FMemo:TMemo;
i:integer;
begin
FMemory.TMemoryStream.Create;
FMemo:=TMemo.Create(Form1);
FMemo.Visible:=False;
FMemo1.Clear;
FMemory.LoadFromFile('путь_до_занятого_файла\файл.txt'); //делаем копию занятого файла в памяти
FMemo.Lines.LoadFromStream(FMemory); // выгружаем из памяти в Memo
FMemory.Free; //освождаем занятую память
For i=0 to FMemo.Lines.Count-1 do
begin
{ обработка всего что попало в FMemo }
end;
end;
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 231