-
Есть игрушка, которая пишет лог. Сделал простое приложение для отслеживания лога в реальном времени:
hDir := CreateFile(PWideChar(fDirPath), GENERIC_READ,
FILE_SHARE_READ or FILE_SHARE_WRITE
or FILE_SHARE_DELETE, nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
repeat
if Terminated then
Exit;
if ReadDirectoryChangesW(hDir, lpBuf, BUF_SIZE, True,
FILE_NOTIFY_CHANGE_LAST_WRITE or FILE_NOTIFY_CHANGE_SIZE or FILE_NOTIFY_CHANGE_CREATION , @cbReturn, nil, nil)
then PostMessage(FWnd, WM_USER + 1, 5, 5); until false;
CloseHandle(hDir);
следит за каталогом с логом (т.е. без всяких там Overlapped) Что меня не устраивает - пока не зайду в каталог, открытый в проводнике, и не нажму F5 - ReadDirectoryChangesW не отработает. Win7 x32 Винда недавно установленная, лицензионная Что это такое, кто может объяснить? Хотя, фиг с ним, почему, скажите, как отследить в реальном времени?
-
вот реально, открыт проводник с каталогом, рядом окно программы. Нажимаю F5 - в формочке добавляется строка с сообщением об изменениях.
-
-
Да, косяк, скопипастил по-быстрому. Но функция же срабатывает? поменял на hDir := CreateFile(PWideChar(fDirPath), FILE_LIST_DIRECTORY,
FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE,
nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS , 0); то же самое. почитаю по дороге на работу ссылку.
-
> Rouse_ © (03.05.12 23:32) [2] > > > > Cobalt © (03.05.12 23:25) > > Вовч, у тябя в пяти метрах от кабинета сидят пять эникейщиков. > > Если бы ты периодически к ним подходил, то они б тебе сказали > что: "This directory must be opened with the FILE_LIST_DIRECTORY > access right."
Не ну. Разве я не задавал вопрос в "Прочее/Потрепаться" почему ваша банда столь часто общается друг с другом через форум ДМ" У вас что нет "курилки"? Розыч курит, Ёжка курит, Макс курит, Cobalt не помню. )))
-
-
> AV © (04.05.12 08:37) [5] Так же работает - т.е.пока в проводнике не обновлю, изменения не ловит :(
Видать, придется по-простому, по таймеру проверять :(
-
> Cobalt © (04.05.12 10:43) [6]
да, в принципе, так и должно быть, т.к. там тоже самое. Просто, может, где что-то пропущено было, подумал.
Но у меня работает. Видать, что-то с правами/объектами Надо Розыча ссылку почитать.
-
> Cobalt © (03.05.12 23:25) > Есть игрушка, которая пишет лог. > Сделал простое приложение для отслеживания лога в реальном > времени:
Вот погляди, тут несколько моих классов для мониторинга: a) Изменения в каталоге b) Изменения в файле с) Изменения в текстовом файле Там можно посмотреть как и что правильно мониторить ну или выдернуть кусок или использовать как есть. http://narod.ru/disk/48064915001.2690225972678432a4f8cd17532f24e3/Monitors.zip.html
-
дело не в правах если проводник не обновляет инфу о файле или не показывает вновь созданые файлы без обновления - значит он мертв а мертв он бывает изза говенных расширений и чудоутилит
-
Причем, на WinXP все замечательно отрабатывает А дома, на Win7 - нет. Пробовал запустить из под админа - та же фигня.
-
Если вдруг надо, есть еще мониторинг CSV файла (там свои заморочки и большие)
-
> Cobalt © (04.05.12 11:28) [10]
> А дома, на Win7 - нет.
Что-то у тебя с системой вероятно, мое работает даже на еще не вышедшей Windows 8. Если не заработает, то дело в системе 100%.
> если проводник не обновляет инфу о файле или не показывает > вновь созданые файлы без обновления - значит он мертв > а мертв он бывает изза говенных расширений и чудоутилит
скорее всего так и есть
-
Дело-то не в проводнике - он прекрасно показывает изменения, а в программе.
она отчего-то завязывается на отображение изменений в проводнике. т.е. пока не выберешь изменившийся файл в проводнике (что заставит его перечитать свойства файла) - поток не вернет управление из ReadDirectoryChangesW Такое ощущение, что она экспортируется из Shell32.dll а не из kernel32.dll
-
> DVM © (04.05.12 11:24) [8] Главный вопрос - под Win7 тестировал?
-
> под Win7 тестировал?
не мне, но отвечу :) У меня дома на win7(64x) работает ReadDirectoryChangesW нормально
-
> Cobalt © (04.05.12 11:36) [14] > > DVM © (04.05.12 11:24) [8] > Главный вопрос - под Win7 тестировал?
Именно под Win7 - нет, но тестировалось под Windows 2008 Server R2, Windows Server 2011 ну и под серверными системами разными в основном. Но могу проверить и под Win7 чуть попозже.
-
> DVM ©
ты б еще проект1.dpr какой приложил, что б не разбираться особо как юзать ...
-
> (т.е. без всяких там Overlapped)
а может попробовать с ним + CompletionPort ? у меня так работает,даже в совсем замученой системе с симптомами как в [9]
-
> AV © (04.05.12 11:45) [17]
> что б не разбираться особо как юзать ...
Для мониторинга файла: FileContentsMonitor := TFileContentsMonitor.Create(edtFileName.Text,
true, OnError, OnNewData); Где: procedure TForm1.OnError(Sender: TObject; E: Exception);
var
ErrorMessage: string;
begin
ErrorMessage := Format('%s: %s - %s', [Sender.ClassName, E.ClassName, E.Message]);
end;
procedure TForm1.OnNewData(Sender: TObject; Buffer: PByte; BufferSize: integer);
var
Data: PChar;
begin
GetMem(Data, BufferSize + 1);
try
ZeroMemory(Data, BufferSize + 1);
Move(Buffer^, Data^, BufferSize);
mmoLog.Lines.Add('New data: ' + StrPas(Data));
finally
FreeMem(Data)
end;
end; Остановка мониторинга: FileContentsMonitor.Shutdown;
FileContentsMonitor.Free;
|