2012-06-26 7 views
5

मैं अलग थ्रेड एप्लिकेशन कॉन्फ़िगरेशन फ़ाइल में निगरानी कर रहा हूं, जो कुछ मामलों में आईएनआई किसी अन्य एक्सएमएल या दूसरे में हो सकता है।क्यों ReadDirectoryChangesW, केवल FILE_NOTIFY_CHANGE_LAST_WRITE फ़िल्टर के साथ, फ़ाइल संपादन पर एक से अधिक ईवेंट सिग्नल करता है?

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; 

यह क्यों संकेत कम से कम 2 बार और कैसे सही संकेत प्राप्त करने के लिए जब कॉन्फ़िग फ़ाइल में कुछ झंडा बदल दिया गया और बचा लिया गया था: धागा निगरानी निर्देशिका (डेल्फी में) की कोड कुछ इस तरह है?

+0

वैसे: FILE_NOTIFY_CHANGE_LAST_ACCESS केवल फ़िल्टर केवल एक बार सिग्नलिंग कर रहा है - अंतर क्या है? – ALZ

उत्तर