Programmierung

Verzeichnisse und Dateien überwachen

Sobald Dateien oder Verzeichnisse erstellt, verändert oder gelöscht werden, sollen Systeme oft gewisse Aufgaben ausführen. Zum Beispiel diese Datei in eine Datenbank eintragen oder einen gewissen Benutzer über die Veränderung informieren. In CONZEPT 16 gibt es die Möglichkeit Dateien und Verzeichnisse zu überwachen.


FsiMonitorOpen()

Um eine Verzeichnisüberwachung einzurichten muss als erstes der Befehl FsiMonitorOpen() aufgerufen werden. Diesem Befehl wird als erster Parameter der Deskriptor eines Fenster-Objekts übergeben in dem das Ereignis hinterlegt ist. Als zweiten und dritten Parameter werden die Verzögerung des ersten und die Verzögerung aller weiteren Ereignis-Aufrufe übergeben. Das Resultat ist der Deskriptor der Verzeichnisüberwachung.

// Erster Ereignis-Aufruf nach einer Sekunde jeder weitere nach drei Sekunden
tFsiMonitor # tFrame->FsiMonitorOpen(1000, 3000);

FsiMonitorAdd()

Nun kann dem Deskriptor der Verzeichnisüberwachung mit dem Befehl FsiMonitorAdd() ein Verzeichnis, das überwacht werden soll, hinzugefügt werden. Dieser Befehl kann mehrmals aufgerufen werden, um verschiedene Verzeichnisse zu überwachen. Weiterhin kann in diesem Befehl optional angegeben werden ob untergeordnete Verzeichnisse mit überwacht werden oder ob Änderungen ignoriert werden sollen. Es können außerdem explizit nicht zu überwachende Dateien und explizit zu überwachende Dateien angegeben werden.

// Alle Änderungen in „Eigene Dateien“ und Unterordnern außer temporäre Dateien überwachen
tFsiMonitor->FsiMonitorAdd(_Sys->spPathMyDocuments, _FsiMonFlagsSubDirs, '*.tmp');

// Alle .txt Dateien auf dem Desktop überwachen
tFsiMonitor->FsiMonitorAdd(_Sys->spPathDesktop,0,'', '*.txt');

FsiMonitorControl()

Die Überwachung kann mit dem FsiMonitorControl() gestartet und beendet werden. Zum Starten wird der Parameter _FsiMonitorStart und zum Stoppen _FsiMonitorStop übergeben.

// Startet die Überwachung
tFsiMonitor->FsiMonitorControl(_FsiMonitorStart);

FsiMonitorRemove()

Ein überwachtes Verzeichnis kann mit dem Befehl FsiMonitorRemove() wieder entfernt werden. Dazu wird dem Befehl der Pfad des zu entfernenden Verzeichnisses übergeben.

// Desktopüberwachung entfernen
tFsiMonitor->FsiMonitorRemove(_Sys->spPathDesktop);

FsiMonitorClose()

Um den Deskriptor der Verzeichnisüberwachung zu schließen wird der Befehl FsiMonitorClose() verwendet.

tFsiMonitor->FsiMonitorClose();

EvtFsiMonitor

Ist die Verzeichnisüberwachung eingerichtet wird bei jeder Erstellung, Veränderung und Löschung einer Datei das Event EvtFsiMonitor aufgerufen.

sub EvtFsiMonitor
(
  aEvt                 : event;    // Ereignis
  aAction              : int;      // Dateioperation
  aFileName            : alpha;    // Dateiname
  aFileAttrib          : int;      // Dateiattribute
  aFileSize            : bigint;   // Dateigröße
  aFileCT              : caltime;  // Datum-/Uhrzeit der Änderung
  aFileNameOld         : alpha;    // Alter Dateiname beim Umbenennen
)
: logic;

aAction
In diesem Parameter wird die Aktion übergeben, die zu einer Änderung im Verzeichnis geführt hat. Dafür gibt es folgende Konstanten:

_FsiMonActionCreate Eine Datei wurde angelegt
_FsiMonActionDelete Eine Datei wurde gelöscht
_FsiMonActionModify Eine Datei wurde verändert
_FsiMonActionRename Eine Datei wurde umbenannt

aFilename
Der Namen der Datei, welche die Aktion betrifft.

aFileAttrib
Dies sind die Datei-Attribute der neuen oder veränderten Datei. Diese können mit folgenden Konstanten verglichen werden:

_FsiAttrArchive Archiv-Attribut ist gesetzt.
_FsiAttrDir Verzeichnis-Attribut ist gesetzt.
_FsiAttrExec Die Datei ist ausführbar.
_FsiAttrHidden Die Datei / Das Verzeichnis ist versteckt.
_FsiAttrRead Die Datei kann nur gelesen werden.
_FsiAttrSystem System-Attribut ist gesetzt.

aFileSize
Enthält die Dateigröße in Byte.

aFileCT
Hier wird das Datum und die Uhrzeit der letzten Änderung der Datei übergeben.

aFileNameOld
Falls eine Datei umbenannt wurde, enthält dieser Parameter den Namen der Datei vor der Umbenennung.

Beispiel:

sub EvtFsiMonitor
(
  aEvt           : event;       // Ereignis
  aAction        : int;         // Dateioperation
  aFileName      : alpha(1024); // Dateiname
  aFileAttrib    : int;         // Dateiattribute
  aFileSize      : bigint;      // Dateigröße
  aFileCT        : caltime;     // Datum-/Uhrzeit der Änderung
  aFileNameOld   : alpha(1024); // Alter Dateiname beim Umbenennen
) : logic

{
  switch (aAction)
  {
    case _FsiMonActionCreate :
      DbaLog(_LogInfo, false,
        'Es wurde die Datei ' + aFileName + ' angelegt.');

    case _FsiMonActionModify :
      DbaLog(_LogInfo, false,
        'Es wurde die Datei ' + aFileName + ' verändert.');

    case _FsiMonActionDelete :
      DbaLog(_LogInfo, false,
        'Es wurde die Datei ' + aFileName + ' gelöscht.');

    case _FsiMonActionRename :
      DbaLog(_LogInfo, false,
        'Es wurde die Datei ' + aFileNameOld + ' nach ' +
        aFileName + ' umbenannt.');
  }
  return(true);
}
5 Kommentare

5 Kommentare “Verzeichnisse und Dateien überwachen”

  1. @Patrick
    Habe das nochmals getestet. Funktioniert im Allgemeinen. Ich habe Parallels Desktop auf meinem Mac laufen. Dort erscheinen die Mac-Laufwerke als verbundene Netzwerklaufwerke in Windows. Damit funktioniert es nicht. Liegt aber wahrscheinlich an Parallels …

Kommentar abgeben