delphi 为什么只有FILE_NOTIFY_CHANGE_LAST_WRITE过滤器的ReadDirectoryChangesW会在文件编辑时发出多个事件的信号?

rkue9o1l  于 2023-08-04  发布在  其他
关注(0)|答案(1)|浏览(107)

我在单独的线程应用程序配置文件中进行监视,在某些情况下,该文件可能是另一个XML或另一个XML中的INI。线程监控目录的代码(在 Delphi 中)是这样的:

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次,如何得到正确的信号时,一些标志在配置文件被更改,并保存?

cygmwpex

cygmwpex1#

Raymond Chen在他的博客上解释道:https://devblogs.microsoft.com/oldnewthing/20140507-00/?p=1053
简而言之,“因为多个东西被修改了。”

相关问题