FileChanges.pas 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  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. {==============================================================}
  49. { FileDeleteThread: }
  50. {==============================================================}
  51. constructor TFileDeleteThread.Create(Files: TstringList; TimeOut : DWord; SignalProc : TFileDeleteEvent);
  52. Begin
  53. inherited Create(True);
  54. FreeOnTerminate := TRUE;
  55. fOnSignalDelete := SignalProc;
  56. fFiles := TStringList.Create;
  57. fDelFiles := TStringList.Create;
  58. FFiles.Assign(Files);
  59. GetSystemTimeAsFileTime(fEndTime);
  60. INT64(fEndTime) := INT64(fEndTime) + TimeOut * 10000000;
  61. Resume;
  62. End; {TFileDeleteThread.Create}
  63. procedure TFileDeleteThread.Execute;
  64. Var SRec : TSearchRec;
  65. i : Integer;
  66. DosError : Integer;
  67. ChangeDetected : Boolean;
  68. ThisTime : FILETIME;
  69. Begin
  70. repeat
  71. {Wait 500 Milliseconds before starting next polling cyclus:}
  72. Sleep(500);
  73. ChangeDetected := False;
  74. i := 0;
  75. While i <= Pred(fFiles.Count) Do
  76. Begin
  77. DosError := SysUtils.FindFirst(fFiles[i], faAnyFile, SRec);
  78. IF DosError <> 0 Then
  79. Begin
  80. ChangeDetected := True;
  81. fDelFiles.Add(fFiles[i]);
  82. fFiles.Delete(i);
  83. End
  84. Else
  85. INC(i);
  86. SysUtils.FindClose(SRec);
  87. End;
  88. IF ChangeDetected And Assigned(fOnSignalDelete) Then
  89. Begin
  90. Synchronize(DoOnSignalDelete);
  91. fDelFiles.Clear;
  92. End;
  93. {Timeout reached? }
  94. GetSystemTimeAsFileTime(ThisTime);
  95. IF INT64(ThisTime) >= INT64(fEndTime) Then
  96. Break;
  97. until Terminated Or (fFiles.Count = 0);
  98. End; {TFileDeleteThread.Execute}
  99. procedure TFileDeleteThread.DoTerminate;
  100. Begin
  101. fFiles.Free;
  102. fDelFiles.Free;
  103. Inherited DoTerminate;
  104. End; {TFileDeleteThread.DoTerminate}
  105. Procedure TFileDeleteThread.DoOnSignalDelete;
  106. Begin
  107. If Assigned(fOnSignalDelete) Then
  108. fOnSignalDelete(Self, fDelFiles);
  109. End; {TFileDeleteThread.DoSignalDelete}
  110. end.