2012-06-26 5 views
5

Estoy supervisando en un archivo de configuración de la aplicación de hebras por separado, que en algunos casos puede ser INI en otro XML u otro. Código de directorio de Control del hilo (en Delphi) es algo como esto:¿Por qué ReadDirectoryChangesW, con solo el filtro FILE_NOTIFY_CHANGE_LAST_WRITE, señala más de un evento en la edición de archivos?

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; 

¿Por que las señales de al menos 2 veces y cómo obtener la señal correcta cuando algún indicador en el archivo de configuración se cambió y se salvó?

+0

Por cierto: el filtro FILE_NOTIFY_CHANGE_LAST_ACCESS only está señalizando solo una vez: ¿CUÁL es la diferencia? – ALZ

Respuesta

Cuestiones relacionadas