Realisierung einer File/Dir Change Notifikation

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1641
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Realisierung einer File/Dir Change Notifikation

Beitrag von corpsman »

Servus,

Ich suche nach einer möglichst einfachen Variante der FilechangeNotivication.

z.B. so

Code: Alles auswählen

 
var CN:TChangeNotifier;
begin
  cn := TChangeNotifier.create(form1);
  cn.addFile('C:\test.txt'); 
  cn.addDirectory('c:\temp');
  cn.OnChange := @form1.OnChangeEvent;
..
end;
 
Procedure TForm1.OnChangeEvent(Object:Sender; Filename:String; State:TChangeState);
begin
end;
 
Nach einer diversen Google suche habe ich auch einiges zum Thema gefunden :

http://forum.lazarus.freepascal.org/ind ... ic=21739.0
http://lists.lazarus.freepascal.org/pip ... 83014.html
www.delphipraxis.net/110205-readdirectorychangesw.html
http://mobile.osnews.com/printer.php?news_id=7376

Auf die Schnelle lies sich das aber nicht compilieren. Daher die Frage hat hier im Forum schon jemand sowas gemacht, erfahren damit ?
Die Lazarus IDE kanns ja auch, generell scheint es zu gehen. Für Mich wichtig ist Änderungen von Dateien erkennen, und das unter Windows und Linux.

Gruß

Corpsman
--
Just try it

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Realisierung einer File/Dir Change Notifikation

Beitrag von mse »

MSEgui hat eine entsprechende Komponente (tfilechangenotifier). Der code ist hier:
https://gitorious.org/mseide-msegui/mse ... change.pas

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1641
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Realisierung einer File/Dir Change Notifikation

Beitrag von corpsman »

Die MSE Tools können echt alles ;).

Hab das geladen, aber ich bekomme es noch nicht zum laufen.Hab allerdings auch noch nicht aufgegeben, bei Erfolg oder nicht Erfolg würd ich mich noch mal melden.

Gruß

Corpsman
--
Just try it

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1641
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Realisierung einer File/Dir Change Notifikation

Beitrag von corpsman »

So ich habe es versucht, aber ich bekomme die MSE Library nicht kompiliert. Da das MSDN aber eigentlich recht gut dokumentiert ist, habe ich es mal selbst versucht. Und siehe Da meine Klasse Erkennt File und Directory Changes wunderbar (zumindest unter Windows).

Nun habe ich aber das Problem, dass Heaptrace mir jedesmal, wenn meine Anwendung eine Notification entdeckt, sagt dass ich 24 Byte verliere (siehe Screenshot)
Wenn ich die Anwendung starte und wieder beende, ohne dass es eine Notification gibt. Dann ist Heaptrace zufrieden.

Kann mir einer von euch weiter helfen ?

Habe hier mal meine Klasse auf das nötigste Runtergebrochen. Der Fehler wird so immer noch erzeugt :

Code: Alles auswählen

 
 
(* Informations Taken from :
 *
 * http://msdn.microsoft.com/en-us/library/windows/desktop/aa365465%28v=vs.85%29.aspx // ReadDirectoryChangesW
 * http://msdn.microsoft.com/en-us/library/windows/desktop/aa364391%28v=vs.85%29.aspx // FILE_NOTIFY_INFORMATION
 *
 * http://msdn.microsoft.com/en-us/library/aa365261%28v=vs.85%29.aspx // Obtaining Directory Change Notifications
 *)
Unit cn_monitor;
 
{$MODE objfpc}{$H+}
 
Interface
 
Uses
  Classes, SysUtils, windows;
 
Type
 
  TDirectoryChangeEvent = Procedure(Sender: tobject; Directory: String) Of Object;
  TFileChangeEvent = Procedure(Sender: tObject; Filename: String) Of Object;
 
  TReport = Record
    Value: String; // Name of the Directory or Filename
    IsFile: Boolean; // Selector for File or Directory
  End;
 
  { TCnMonitor }
 
  TCnMonitor = Class(tThread) // Die Klasse, welche das Monitoring Bereit Stellt
  private
    fTWOHandleArray: TWOHandleArray;
    FRunning: Boolean;
    Procedure Report();
  protected
    Procedure Execute; override;
  public
    OnDirectoryChangeEvent: TDirectoryChangeEvent;
    OnFileChangeEvent: TFileChangeEvent;
    Property IsRunning: Boolean read FRunning;
    Constructor Create();
    Destructor Destroy; override;
  End;
 
Implementation
 
{ TCnMonitor }
 
Procedure TCnMonitor.Execute;
Var
  obj: DWORD;
Begin
  While Not Terminated Do Begin
    obj := WaitForMultipleObjects(1, @fTWOHandleArray, false, 10);
    If obj = WAIT_OBJECT_0 Then Begin
      //Wird dieser Code Aufgerufen, dann gibts ein Memory Leak von 24 Byte
      Synchronize(@Report);
      FindNextChangeNotification(fTWOHandleArray[0]);
    End;
    sleep(1);
  End;
  FRunning := False;
End;
 
Procedure TCnMonitor.Report;
Begin
  OnFileChangeEvent(self, 'c:\temp\');
End;
 
Constructor TCnMonitor.Create;
Begin
  Inherited create(false);
  FRunning := True;
  fTWOHandleArray[0] := FindFirstChangeNotificationW('c:\temp\', false, 31);
End;
 
Destructor TCnMonitor.Destroy;
Begin
  Terminate;
  While IsRunning Do Begin
    Sleep(1);
  End;
  FindCloseChangeNotification(fTWOHandleArray[0]);
End;
 
End.
Dateianhänge
heatrace.png
heatrace.png (9.23 KiB) 1300 mal betrachtet
--
Just try it

Benutzeravatar
theo
Beiträge: 10951
Registriert: Mo 11. Sep 2006, 19:01

Re: Realisierung einer File/Dir Change Notifikation

Beitrag von theo »

Für jede Notification 24 Byte oder nur falls es mindestens eine gibt?
Im letzteren Fall würde ich es ignorieren, wenn sich nichts anhäuft. Beim Schliessen wird der Speicher eh freigegeben vom BS.
Ich sehe da im Moment nichts besonderes.

Was passiert eigentlich, wenn du das Loop und Terminate Zeug bei Destroy nicht machst?

Code: Alles auswählen

Destructor TCnMonitor.Destroy;
Begin
  FindCloseChangeNotification(fTWOHandleArray[0]);
  inherited;
End;

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1641
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Realisierung einer File/Dir Change Notifikation

Beitrag von corpsman »

Es scheint so als würden tatsächlich immer nur die 24 Byte verloren gehen. Also nur falls es mindestens eine gibt.

Wenn ich das Loop zeug weg lasse bekomme ich beim Beenden eine AV.

Da ich hauptsächlich sowieso Linux benutzer bin, stört mich das Speicherloch ansich nicht wirklich, aber so richtig sauber ists halt leider auch nicht :(
--
Just try it

Benutzeravatar
theo
Beiträge: 10951
Registriert: Mo 11. Sep 2006, 19:01

Re: Realisierung einer File/Dir Change Notifikation

Beitrag von theo »

Ich hatte auch noch ein Inherited im Desrtuktor eingebaut.
Das sollte eigentlich sowieso da sein.
Hilft das auch nicht?

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1641
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Realisierung einer File/Dir Change Notifikation

Beitrag von corpsman »

lol, das hatte ich übersehen, wenn das Drin ist, brauche ich die While schleife natürlich nicht mehr..

Damit es sauber geht (ohne While kommt ab und an eine AV, weil der Thread ja noch auf die Handles zugreift, welche ich im Destroy schon freigegeben hatte), musste ich es allerdings wieder rein machen. Doch dein Hinweis war der Richtige. Nun da ich das inherited drin habe. Ist auch der Memleak weg. Vielen Dank. Damit geht die Windows Variante nun.

Bleibt die Linux Variante und ich habe was ich wollte *g*.
--
Just try it


Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1641
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Realisierung einer File/Dir Change Notifikation

Beitrag von corpsman »

*g*

teile avon hatte ich auch schon gefunden, aber danke für die Zusammenstellung. Mein Ziel eine Komponente, welche Plattformunabhängig (Windows / Linux) Dateien und Verzeichnisse überwacht rückt immer näher. Die Windowsfunktion funktioniert dank Theo nun wunderbar. Sobald ich die Linux Version drin hab, veröffentliche ich es wie gewohnt.

Gruß

Corpsman
--
Just try it

Antworten