मैं अलग थ्रेड एप्लिकेशन कॉन्फ़िगरेशन फ़ाइल में निगरानी कर रहा हूं, जो कुछ मामलों में आईएनआई किसी अन्य एक्सएमएल या दूसरे में हो सकता है।क्यों 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 बार और कैसे सही संकेत प्राप्त करने के लिए जब कॉन्फ़िग फ़ाइल में कुछ झंडा बदल दिया गया और बचा लिया गया था: धागा निगरानी निर्देशिका (डेल्फी में) की कोड कुछ इस तरह है?
वैसे: FILE_NOTIFY_CHANGE_LAST_ACCESS केवल फ़िल्टर केवल एक बार सिग्नलिंग कर रहा है - अंतर क्या है? – ALZ