FileChanges.pas 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. unit FileChanges;
  2. {==================================================================
  3. Component TDeleteThread / Version 1.0 / 01.1999
  4. ==================================================
  5. Description:
  6. ============
  7. Runs a separate thread, wich monitors multiple files or directories
  8. for existance. When one of these is deleted, the event OnSignalDelete
  9. is fired.
  10. This component uses findfirst() for searching the monitored files. So
  11. it will also work with network drives. (The WINAPI function
  12. FINDFIRSTCHANGENOTIFICATION does not work with novell network drives.)
  13. Author:
  14. =======
  15. (c) Ingo Eckel 12/1998
  16. Sodener Weg 38
  17. 65812 Bad Soden
  18. Germany
  19. {==================================================================}
  20. interface
  21. uses
  22. SysUtils, Windows, Classes, CompThread;
  23. type
  24. TFileDeleteEvent = procedure (Sender: TObject; Files : TStringList) of object;
  25. {==============================================================}
  26. { FileDeleteThread: }
  27. {==============================================================}
  28. TFileDeleteThread = class(TCompThread)
  29. private
  30. fOnSignalDelete: TFileDeleteEvent;
  31. fFiles : TStringList;
  32. fDelFiles : TStringList;
  33. fEndTime : FILETIME;
  34. protected
  35. procedure Execute; override;
  36. procedure DoTerminate; override;
  37. Procedure DoOnSignalDelete;
  38. public
  39. constructor Create(Files: TstringList; TimeOut : DWord; SignalProc : TFileDeleteEvent);
  40. property Terminated;
  41. published
  42. property OnSignalDelete : TFileDeleteEvent read fOnSignalDelete
  43. write fOnSignalDelete;
  44. end;
  45. {==============================================================}
  46. implementation
  47. {==============================================================}
  48. uses
  49. PasTools;
  50. {==============================================================}
  51. { FileDeleteThread: }
  52. {==============================================================}
  53. constructor TFileDeleteThread.Create(Files: TstringList; TimeOut : DWord; SignalProc : TFileDeleteEvent);
  54. Begin
  55. inherited Create(True);
  56. FreeOnTerminate := TRUE;
  57. fOnSignalDelete := SignalProc;
  58. fFiles := TStringList.Create;
  59. fDelFiles := TStringList.Create;
  60. FFiles.Assign(Files);
  61. GetSystemTimeAsFileTime(fEndTime);
  62. INT64(fEndTime) := INT64(fEndTime) + TimeOut * 10000000;
  63. Resume;
  64. End; {TFileDeleteThread.Create}
  65. procedure TFileDeleteThread.Execute;
  66. Var SRec : TSearchRec;
  67. i : Integer;
  68. DosError : Integer;
  69. ChangeDetected : Boolean;
  70. ThisTime : FILETIME;
  71. Begin
  72. repeat
  73. {Wait 500 Milliseconds before starting next polling cyclus:}
  74. Sleep(500);
  75. ChangeDetected := False;
  76. i := 0;
  77. While i <= Pred(fFiles.Count) Do
  78. Begin
  79. DosError := SysUtils.FindFirst(ApiPath(fFiles[i]), faAnyFile, SRec);
  80. IF DosError <> 0 Then
  81. Begin
  82. ChangeDetected := True;
  83. fDelFiles.Add(fFiles[i]);
  84. fFiles.Delete(i);
  85. End
  86. Else
  87. INC(i);
  88. SysUtils.FindClose(SRec);
  89. End;
  90. IF ChangeDetected And Assigned(fOnSignalDelete) Then
  91. Begin
  92. Synchronize(DoOnSignalDelete);
  93. fDelFiles.Clear;
  94. End;
  95. {Timeout reached? }
  96. GetSystemTimeAsFileTime(ThisTime);
  97. IF INT64(ThisTime) >= INT64(fEndTime) Then
  98. Break;
  99. until Terminated Or (fFiles.Count = 0);
  100. End; {TFileDeleteThread.Execute}
  101. procedure TFileDeleteThread.DoTerminate;
  102. Begin
  103. fFiles.Free;
  104. fDelFiles.Free;
  105. Inherited DoTerminate;
  106. End; {TFileDeleteThread.DoTerminate}
  107. Procedure TFileDeleteThread.DoOnSignalDelete;
  108. Begin
  109. If Assigned(fOnSignalDelete) Then
  110. fOnSignalDelete(Self, fDelFiles);
  111. End; {TFileDeleteThread.DoSignalDelete}
  112. end.