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 Antworten
Wir haben ein Linux-Verzeichnis über Samba verbunden. Das Überwachen funktioniert auch in dieser Konstellation.
@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 …
Funktioniert auch mit Freigaben, Netzlaufwerken, UNC-Pfaden bestens und lässt sich gut kombinieren mit dem Message-Exchange-Befehlssatz.
@TSauter
Prinzipiell funktioniert dieses Verfahren auch mit verbundenen Netzlaufwerken. Gibt es bei Ihnen einen Fall in dem dies nicht möglich ist?
Was ich dazu schon immer fragen wollte: kann es sein daß das nur mit lokalem, nicht aber mit verbundenen Netzlaufwerken funktioniert?