Конференция "WinAPI" » ReadDirectoryChangesW прокает от проводника?
 
  • Cobalt © (03.05.12 23:25) [0]
    Есть игрушка, которая пишет лог.
    Сделал простое приложение для отслеживания лога в реальном времени:

     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 Винда недавно установленная, лицензионная

    Что это такое, кто может объяснить?
    Хотя, фиг с ним, почему, скажите, как отследить в реальном времени?
  • Cobalt © (03.05.12 23:26) [1]
    вот реально, открыт проводник с каталогом, рядом окно программы.
    Нажимаю F5 - в формочке добавляется строка с сообщением об изменениях.
  • 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."
    Ну и в кратце: http://qualapps.blogspot.com/2010/05/understanding-readdirectorychangesw_19.html
  • Cobalt © (04.05.12 00:02) [3]
    Да, косяк, скопипастил по-быстрому.
    Но функция же срабатывает?
    поменял на
     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);


    то же самое.
    почитаю по дороге на работу ссылку.
  • Германн © (04.05.12 01:12) [4]

    > 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]
    недавно писал
    попробуй это, может и у меня работает не в общем случае!?
    http://zalil.ru/33179470
  • Cobalt © (04.05.12 10:43) [6]
    > AV ©   (04.05.12 08:37) [5]
    Так же работает - т.е.пока в проводнике не обновлю, изменения не ловит :(

    Видать, придется по-простому, по таймеру проверять :(
  • AV © (04.05.12 10:47) [7]

    > Cobalt ©   (04.05.12 10:43) [6]

    да, в принципе, так и должно быть, т.к. там тоже самое.
    Просто, может, где что-то пропущено было, подумал.

    Но у меня работает. Видать, что-то с правами/объектами
    Надо Розыча ссылку почитать.
  • DVM © (04.05.12 11:24) [8]

    > Cobalt ©   (03.05.12 23:25) 
    > Есть игрушка, которая пишет лог.
    > Сделал простое приложение для отслеживания лога в реальном
    > времени:

    Вот погляди, тут несколько моих классов для мониторинга:

    a) Изменения в каталоге
    b) Изменения в файле
    с) Изменения в текстовом файле

    Там можно посмотреть как и что правильно мониторить ну или выдернуть кусок или использовать как есть.

    http://narod.ru/disk/48064915001.2690225972678432a4f8cd17532f24e3/Monitors.zip.html
  • QAZ (04.05.12 11:27) [9]
    дело не в правах
    если проводник не обновляет инфу о файле или не показывает вновь созданые файлы без обновления - значит он мертв
    а мертв он бывает изза говенных расширений и чудоутилит
  • Cobalt © (04.05.12 11:28) [10]
    Причем, на WinXP все замечательно отрабатывает
    А дома, на Win7 - нет.
    Пробовал запустить из под админа - та же фигня.
  • DVM © (04.05.12 11:29) [11]
    Если вдруг надо, есть еще мониторинг CSV файла (там свои заморочки и большие)
  • DVM © (04.05.12 11:32) [12]

    > Cobalt ©   (04.05.12 11:28) [10]


    > А дома, на Win7 - нет.

    Что-то у тебя с системой вероятно, мое работает даже на еще не вышедшей Windows 8. Если не заработает, то дело в системе 100%.


    > если проводник не обновляет инфу о файле или не показывает
    > вновь созданые файлы без обновления - значит он мертв
    > а мертв он бывает изза говенных расширений и чудоутилит

    скорее всего так и есть
  • Cobalt © (04.05.12 11:35) [13]
    Дело-то не в проводнике - он прекрасно показывает изменения, а в программе.

    она отчего-то завязывается на отображение изменений в проводнике.
    т.е. пока не выберешь изменившийся файл в проводнике (что заставит его перечитать свойства файла) - поток не вернет управление из ReadDirectoryChangesW
    Такое ощущение, что она экспортируется из Shell32.dll а не из kernel32.dll
  • Cobalt © (04.05.12 11:36) [14]
    > DVM ©   (04.05.12 11:24) [8]
    Главный вопрос - под Win7 тестировал?
  • AV © (04.05.12 11:39) [15]

    > под Win7 тестировал?

    не мне, но отвечу :)
    У меня дома на win7(64x) работает ReadDirectoryChangesW нормально
  • DVM © (04.05.12 11:40) [16]

    > Cobalt ©   (04.05.12 11:36) [14]
    > > DVM ©   (04.05.12 11:24) [8]
    > Главный вопрос - под Win7 тестировал?

    Именно под Win7 - нет, но тестировалось под Windows 2008 Server R2, Windows Server 2011 ну и под серверными системами разными в основном. Но могу проверить и под Win7 чуть попозже.
  • AV © (04.05.12 11:45) [17]

    > DVM ©

    ты б еще проект1.dpr какой приложил, что б не разбираться особо как юзать ...
  • QAZ (04.05.12 11:53) [18]

    >  (т.е. без всяких там Overlapped)

    а может попробовать с ним + CompletionPort ? у меня так работает,даже в совсем замученой системе с симптомами как в  [9]
  • DVM © (04.05.12 11:54) [19]

    > 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;

  • DVM © (04.05.12 11:57) [20]
    Остальное по аналогии:

         DirMonitor := TDirMonitor.Create(edtDirectory.Text,
           '',
           OnFileAction,
           OnError,
           True,
           AllFileNotifyOptions,
           AllFileNotifyActions);



         TextFileMonitor := TTextFileMonitor.Create(edtTextFile.Text,
           true, 1000, OnError, OnNewLine);

  • Cobalt © (04.05.12 15:02) [21]
    Я понял, что мне совсем не нужно использовать эту функцию, спасибо статье.
  • Rouse_ © (04.05.12 19:37) [22]

    > почему ваша банда столь часто общается друг с другом через
    > форум ДМ"

    Потому что мы все участники форума, который создан для общения. Вот ты почему на нем общаешься с другими, ты ж у всех телефоны знаешь :)
  • Cobalt © (04.05.12 23:16) [23]
    Мда, по таймеру тоже не работает. Та же самая фигня.

    Хотя ProcessMonitor прекрасно отлавливает изменения мгновенно :(

    Хотя, не обязательно обновлять в проводнике.
    например, при закрытии файла событие отлавливается.
    Такое ощущение, что работает какое-то кэширование.
    Может, потому что отключено обновление "last access time on NTFS"?
  • Cobalt © (04.05.12 23:47) [24]
    Не знаю почему, но 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;

  • Anatoly Podgoretsky © (05.05.12 07:23) [25]
    > Cobalt  (04.05.2012 23:47:24)  [24]

    А HighSize Пушкин будет обрабатывать
  • Cobalt © (05.05.12 08:02) [26]
    Если он захочет, то пусть обрабатывает.
    А так, уберу, конечно, у меня там не гигабайты.
  • QAZ (05.05.12 11:21) [27]

    > отключено обновление "last access time on NTFS"?

    один из говномифоф об ускорении винды,нувы ребята и даете...
 
Конференция "WinAPI" » ReadDirectoryChangesW прокает от проводника?
Есть новые Нет новых   [134430   +2][b:0][p:0.002]