-
Есть игрушка, которая пишет лог. Сделал простое приложение для отслеживания лога в реальном времени:
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;
-
Остальное по аналогии: DirMonitor := TDirMonitor.Create(edtDirectory.Text,
'',
OnFileAction,
OnError,
True,
AllFileNotifyOptions,
AllFileNotifyActions); TextFileMonitor := TTextFileMonitor.Create(edtTextFile.Text,
true, 1000, OnError, OnNewLine);
-
Я понял, что мне совсем не нужно использовать эту функцию, спасибо статье.
-
> почему ваша банда столь часто общается друг с другом через > форум ДМ"
Потому что мы все участники форума, который создан для общения. Вот ты почему на нем общаешься с другими, ты ж у всех телефоны знаешь :)
-
Мда, по таймеру тоже не работает. Та же самая фигня.
Хотя ProcessMonitor прекрасно отлавливает изменения мгновенно :(
Хотя, не обязательно обновлять в проводнике. например, при закрытии файла событие отлавливается. Такое ощущение, что работает какое-то кэширование. Может, потому что отключено обновление "last access time on NTFS"?
-
Не знаю почему, но FindFirst некорректно считал размер файла, открытого в игре "-1" пришлось принудительно считывать его. for I := 0 to tmpList.Count - 1 do
begin
FileHandle := CreateFile(PWideChar(tmpList[I]), FILE_READ_ATTRIBUTES, FILE_SHARE_READ, nil,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if FileHandle <> INVALID_HANDLE_VALUE then
try
size := GetFileSize(FileHandle, @HighSize);
tmpList.Objects[I] := TObject(size);
finally
CloseHandle(FileHandle);
end
else
sbMain.Panels[2].Text := SysErrorMessage(GetLastError);
end;
-
> Cobalt (04.05.2012 23:47:24) [24]
А HighSize Пушкин будет обрабатывать
-
Если он захочет, то пусть обрабатывает. А так, уберу, конечно, у меня там не гигабайты.
-
> отключено обновление "last access time on NTFS"?
один из говномифоф об ускорении винды,нувы ребята и даете...
|