| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 | unit FileChanges;{================================================================== Component TDeleteThread  /  Version 1.0  / 01.1999 ==================================================    Description:    ============    Runs a separate thread, wich monitors multiple files or directories    for existance. When one of these is deleted, the event OnSignalDelete    is fired.    This component uses findfirst() for searching the monitored files. So    it will also work with network drives. (The WINAPI function    FINDFIRSTCHANGENOTIFICATION does not work with novell network drives.)    Author:    =======    (c) Ingo Eckel 12/1998    Sodener Weg 38    65812 Bad Soden    Germany{==================================================================}interfaceuses  SysUtils, Windows, Classes, CompThread;type  TFileDeleteEvent = procedure (Sender: TObject; Files : TStringList) of object;{==============================================================}{ FileDeleteThread:                                            }{==============================================================}  TFileDeleteThread = class(TCompThread)  private    fOnSignalDelete: TFileDeleteEvent;    fFiles         : TStringList;    fDelFiles      : TStringList;    fEndTime       : FILETIME;  protected    procedure Execute;           override;    procedure DoTerminate;       override;    Procedure DoOnSignalDelete;  public    constructor Create(Files: TstringList; TimeOut : DWord; SignalProc : TFileDeleteEvent);    property Terminated;  published    property OnSignalDelete : TFileDeleteEvent read fOnSignalDelete                                                     write fOnSignalDelete;  end;{==============================================================}implementation{==============================================================}uses  PasTools;{==============================================================}{ FileDeleteThread:                                            }{==============================================================}constructor TFileDeleteThread.Create(Files: TstringList; TimeOut : DWord; SignalProc : TFileDeleteEvent);Begin  inherited Create(True);  FreeOnTerminate := TRUE;  fOnSignalDelete := SignalProc;  fFiles    := TStringList.Create;  fDelFiles := TStringList.Create;  FFiles.Assign(Files);  GetSystemTimeAsFileTime(fEndTime);  INT64(fEndTime) := INT64(fEndTime) + TimeOut * 10000000;  Resume;End; {TFileDeleteThread.Create}procedure TFileDeleteThread.Execute;Var SRec     : TSearchRec;    i        : Integer;    DosError : Integer;    ChangeDetected : Boolean;    ThisTime : FILETIME;Begin  repeat    {Wait 500 Milliseconds before starting next polling cyclus:}    Sleep(500);    ChangeDetected := False;    i := 0;    While i <= Pred(fFiles.Count) Do    Begin      DosError := SysUtils.FindFirst(ApiPath(fFiles[i]), faAnyFile, SRec);      IF DosError <> 0 Then      Begin        ChangeDetected := True;        fDelFiles.Add(fFiles[i]);        fFiles.Delete(i);      End      Else      INC(i);      SysUtils.FindClose(SRec);    End;    IF ChangeDetected And Assigned(fOnSignalDelete) Then    Begin       Synchronize(DoOnSignalDelete);       fDelFiles.Clear;    End;    {Timeout reached? }    GetSystemTimeAsFileTime(ThisTime);    IF INT64(ThisTime) >= INT64(fEndTime) Then      Break;  until Terminated Or (fFiles.Count = 0);End; {TFileDeleteThread.Execute}procedure TFileDeleteThread.DoTerminate;Begin  fFiles.Free;  fDelFiles.Free;  Inherited DoTerminate;End; {TFileDeleteThread.DoTerminate}Procedure TFileDeleteThread.DoOnSignalDelete;Begin  If Assigned(fOnSignalDelete) Then  fOnSignalDelete(Self, fDelFiles);End; {TFileDeleteThread.DoSignalDelete}end.
 |