Форум: "Система";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];
ВнизМониторинг лог файла Найти похожие ветки
← →
Mosquito (2004-04-24 19:37) [0]Как выяснить, что в логе появилась новая строка и считать ее - четвертую строку снизу (с конца)? Проверять обновление желательно 1 раз в одну-три секунды.
Можно следить за размером фала чтобы поймать это событие, считать количество строк в фaйле n, и в цикле добираться до n-4 строки, или есть более красивые решения?
← →
panov © (2004-04-24 23:30) [1]Читай статью на этом сайте...
FindFirst(Next/Close)ChangeNotification
← →
Mosquito © (2004-04-25 15:39) [2]Прочитал статью...
Но почему нижеследующий код в WinMe выдает моментально WAIT_FAILED, а в ХР через 10 сек WAIT_TIMEOUT. Хотя файл увеличивается?! Ничего не понимаю...
procedure TForm1.Button1Click(Sender: TObject);
begin
DTMFFile:=FindFirstChangeNotification("c:\Log\tone.log", FALSE, FILE_NOTIFY_CHANGE_SIZE);
case WaitForSingleObject(DTMFFile, 10000) of
WAIT_OBJECT_0: ShowMessage("WAIT_OBJECT_0");
WAIT_FAILED: ShowMessage("WAIT_FAILED");
WAIT_ABANDONED: ShowMessage("WAIT_ABANDONED");
WAIT_TIMEOUT: ShowMessage("WAIT_TIMEOUT");
end;
end;
← →
panov © (2004-04-25 16:58) [3]Ну так приведи код.
← →
panov © (2004-04-25 16:58) [4]Удалено модератором
← →
Mosquito © (2004-04-25 18:38) [5]Да вот собственно этот кусок и есть:
procedure TForm1.Button1Click(Sender: TObject);
begin
DTMFFile:=FindFirstChangeNotification("c:\Log\tone.log", FALSE, FILE_NOTIFY_CHANGE_SIZE);
case WaitForSingleObject(DTMFFile, 10000) of
WAIT_OBJECT_0: ShowMessage("WAIT_OBJECT_0");
WAIT_FAILED: ShowMessage("WAIT_FAILED");
WAIT_ABANDONED: ShowMessage("WAIT_ABANDONED");
WAIT_TIMEOUT: ShowMessage("WAIT_TIMEOUT");
end;
end;
← →
uny (2004-04-25 19:38) [6]Mosquito, до чего вы модератора довели - сам себя удаляет:) бережнее надо:)
← →
panov © (2004-04-25 22:48) [7]Про ME ничего не могу сказать. А про Xp думаю, что то же самое, что и в W2000.
Из MSDN:
FILE_NOTIFY_CHANGE_SIZE:
The operating system detects a change in file size only when the file is written to the disk. For operating systems that use extensive caching, detection occurs only when the cache is sufficiently flushed.
Т.е. твой программа сможет обнаружить изменение в размере файла только после того, как данные из кэша будут выгружены(например, при закрытии файла, при заполнении буферов в памяти, и т.п.) операционной системой на диск.
Т.е. в твоем случае извещающее событие не происходит в течение 10 сек. Попробуй увеличить время таймаута, да и к атрибутам события бобавь FILE_NOTIFY_CHANGE_LAST_WRITE и FILE_NOTIFY_CHANGE_ATTRIBUTES...
Если протокол пишет твоя программа, то в этом случае все проще.
← →
Mosquito © (2004-04-26 19:43) [8]Странно, не работает функция эта и все... Пробовал время таймаута ставить 30 сек и даже кэширование отключил в свойствах диска - без толку. Не реагирует НИ НА ОДНО событие вообще, кроме таймаута :)... В чем может быть дело-то еще?
Этот протокол пишет не моя программа...
← →
Петров Денис © (2004-04-26 19:56) [9]ReadDirectoryChangesW, и пора, наконец, забить на Win9x.
← →
panov © (2004-04-27 09:54) [10]А где проверка, что FindFirstChangeNotification нормально отработала?
← →
Mosquito © (2004-04-27 22:13) [11]Проверки не было.
Может действительно ReadDirectoryChangesW использовать...
Попробовал, но нижеследующий код тоже не работает... Вроде все по примеру. Где тут видно ошибки опытным глазом? Или этот код вообще не работоспособен?
procedure TForm1.Button1Click(Sender: TObject);
var
DTMFFile : THandle;
begin
DTMFFile:=CreateFile("c:\Log\tone.log",GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
Repeat
if ReadDirectoryChangesW(DTMFFile,nil,0,FALSE,FILE_NOTIFY_CHANGE_SIZE,nil,nil,nil)=TRUE then ShowMessage("!!!!");
Until false;
end;
Проверок тоже, кстати, нет.
← →
panov © (2004-04-27 22:59) [12]Удалено модератором
← →
panov © (2004-04-27 23:00) [13]Все работает -
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ToolWin, ComCtrls;
type
TForm1 = class(TForm)
ToolBar1: TToolBar;
Button1: TButton;
ListBox1: TListBox;
Button2: TButton;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
H: THandle;
isProcessStop: Boolean;
implementation
{$R *.dfm}
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
CLoseHandle(H);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
RetWait: Integer;
begin
if H<>0 then Exit;
isProcessStop := False;
H := FindFirstChangeNotification(
"c:\1",
True,
FILE_NOTIFY_CHANGE_FILE_NAME+
FILE_NOTIFY_CHANGE_SIZE+
FILE_NOTIFY_CHANGE_LAST_WRITE);
if H=INVALID_HANDLE_VALUE then
begin
ShowMessage(SysErrorMessage(GetLastError));
Exit;
end;
if H=0 then
begin
ListBox1.Items.Add("Объект нотификации не создан");
Exit;
end;
while True do
begin
FindNextChangeNotification(H);
RetWait := WaitForSingleObject(H,10);
case RetWait of
WAIT_OBJECT_0: ListBox1.Items.Add("Изменения в каталоге");
end;
Application.ProcessMessages;
if isProcessStop then
begin
FindCloseChangeNotification(H);
H := 0;
ListBox1.Items.Add("Монитор остановлен");
Exit;
end;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
isProcessStop := True;
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if H<>0 then CanCLose:= False;
end;
initialization
H := 0;
end.
← →
Imageman (2004-04-28 10:53) [14]Сразу вопрос на засыпку - таким образом можно отслеживать изменения на сетевых дисках? Видимо нет.
А про считывание лога с нужной строки все довольно просто - запоминаешь размер файла. Если файл увеличился, то открываешь файл и прыгаешь в запомненную позацию. Происходит это быстро. А потом с запомненного места читаешь все до конца файла. (Делать это нужно в filestream с режимом только для чтения и без всяких запретов, а то могут быть проблемы в том случае, когда две программы пытаются работать с одним файлом).
Кстати, у меня есть такая прога. Правда в несколько сыроватом виде. Отслеживает log файл и (в случае нахождения нужных строк) запускает любой файл (например alarm.MP3).
← →
Mosquito © (2004-04-28 21:05) [15]БООЛЬШОЕ ВСЕМ СПАСИБО!
Отдельное СПАСИБО panov"у :)
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.037 c