1
0
mirror of https://github.com/winscp/winscp.git synced 2026-10-24 02:28:55 +03:00
Files
winscp/source/packages/filemng/FileChanges.pas
Martin Prikryl 26b6b13bc8 5.6
2018-01-11 15:36:22 +01:00

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.