mirror of
https://github.com/winscp/winscp.git
synced 2026-10-24 02:28:55 +03:00
145 lines
3.9 KiB
ObjectPascal
145 lines
3.9 KiB
ObjectPascal
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.
|