Delphiモニタファイルの変更


unit FileSysThread;

interface

uses
  Windows, SysUtils, Classes, comctrls;

type
  TFileSysNotifyThread = class(TThread)
  private
    ErrCode: Integer;
    KillAddress: PInteger;
    NotifyHandle: THandle;
    WatchPath: string;
    WatchMask: Integer;
    procedure SignalFileNotification;
  protected
    procedure Execute; override;
  public
    constructor Create(const AWatchPath: string; AWatchMask: Integer; var Myself: TFileSysNotifyThread);
    destructor Destroy; override;
  end;

implementation

uses Dialogs;

constructor TFileSysNotifyThread.Create(const AWatchPath: string; AWatchMask: Integer; var Myself: TFileSysNotifyThread);
begin
  inherited Create(True);
  WatchPath := AWatchPath;
  WatchMask := AWatchMask;
  KillAddress := Addr(Myself);
  Priority := tpLower;
  FreeOnTerminate := True;
  Suspended := False;
end;

destructor TFileSysNotifyThread.Destroy;
begin
  if NotifyHandle <> THandle(-1) then
    FindCloseChangeNotification(NotifyHandle);
  inherited Destroy;
  KillAddress^ := 0;
end;

procedure TFileSysNotifyThread.Execute;
begin
  NotifyHandle := FindFirstChangeNotification(PChar(WatchPath), True, WatchMask);
  if NotifyHandle <> THandle(-1) then
    while not Terminated do begin
      ErrCode := WaitForSingleObject(NotifyHandle, 250);
      case ErrCode of
        Wait_Timeout:
          ;
        Wait_Object_0:
          begin
            Synchronize(SignalFileNotification);
            FindNextChangeNotification(NotifyHandle);
          end;
      else ;
      end;
    end;
end;

procedure TFileSysNotifyThread.SignalFileNotification;
begin
  ShowMessage(' ! ');
end;

end.