2012-06-26 6 views
5

Monitoruję w osobnym pliku konfiguracyjnym aplikacji wątku, który w niektórych przypadkach może być INI w innym pliku XML lub innym. Kodeks wątku katalogu monitorowania (w Delphi) jest mniej więcej tak:Dlaczego ReadDirectoryChangesW, tylko z filtrem FILE_NOTIFY_CHANGE_LAST_WRITE, sygnalizuje więcej niż jedno zdarzenie podczas edycji pliku?

procedure TWatcherThread.Execute; 
type 
    PFileNotifyInformation = ^TFileNotifyInformation; 
    TFileNotifyInformation = record 
    NextEntryOffset: DWORD; 
    Action: DWORD; 
    FileNameLength: DWORD; 
    FileName: WideChar; 
    end; 
const 
    BufferLength = 65536; 
var 
    Filter, BytesRead: DWORD; 
    InfoPointer: PFileNotifyInformation; 
    Offset, NextOffset: DWORD; 
    Buffer: array[0..BufferLength - 1] of byte; 
    Overlap: TOverlapped; 
    Events: array[0..1] of THandle; 
    WaitResult: DWORD; 
    FileName, s: string; 
begin 
    if fDirHandle <> INVALID_HANDLE_VALUE then begin 
    Filter := FILE_NOTIFY_CHANGE_LAST_WRITE; 

    FillChar(Overlap, SizeOf(TOverlapped), 0); 
    Overlap.hEvent := fChangeHandle; 

    Events[0] := fChangeHandle; 
    Events[1] := fShutdownHandle; 

    while not Terminated do begin 
     FillChar(Buffer,SizeOf(Buffer),0); 
     if ReadDirectoryChangesW (fDirHandle, @Buffer[0], BufferLength, TRUE, 
     Filter, @BytesRead, @Overlap, nil) 
     then begin 
     WaitResult := WaitForMultipleObjects(2, @Events[0], FALSE, INFINITE); 
     if WaitResult = WAIT_OBJECT_0 then begin 
      InfoPointer := @Buffer[0]; 
      Offset := 0; 
      repeat 
      NextOffset := InfoPointer.NextEntryOffset; 
      FileName := WideCharToString(@InfoPointer.FileName); 

      if (InfoPointer.Action = FILE_ACTION_MODIFIED) and (CompareText(FileName, 'MyConfig.ini') = 0) then begin //read changes in config or INI file 
       // Do Action.. refresh runtime flags 
      end; 
      PByte(InfoPointer) := PByte(DWORD(InfoPointer) + NextOffset); 
      Offset := Offset + NextOffset; 
      until NextOffset = 0; 
     end; 
     end; 
    end; 
    end; 
end; 

Dlaczego sygnalizuje co najmniej 2 razy i jak uzyskać prawidłowy sygnał, gdy niektóre flagi w pliku konfiguracyjnym został zmieniony i został uratowany?

+0

Nawiasem mówiąc: filtr FILE_NOTIFY_CHANGE_LAST_ACCESS sygnalizuje tylko jeden raz - CO TO JEST różnica? – ALZ

Odpowiedz

Powiązane problemy