Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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.029 c
3-1083421788
Mishenka
2004-05-01 18:29
2004.05.30
Данные в таблицах.


1-1084879696
sachem
2004-05-18 15:28
2004.05.30
Как перевести символьное шестнадцатеричное число в целое?


7-1083067682
jk
2004-04-27 16:08
2004.05.30
Как перенести закладки с компонентами с другово профиля


3-1083739703
Ирина
2004-05-05 10:48
2004.05.30
Вопрос по поводу того как использовать модуль


1-1084821008
Yong
2004-05-17 23:10
2004.05.30
net send программно?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский