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
- {==================================================================}
- interface
- uses
- 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.
|