DrvGetFileEntries
Das Ereignis wird aufgerufen, wenn ein Verzeichnis des Laufwerks gelesen wird. Die Informationen in dem Datenpaket beziehen sich auf das zu lesende Verzeichnis. Im Bereich ItemAuthUserDomain wird der am Betriebssystem angemeldete Benutzer übergeben.
Befindet sich der Eintrag bereits im Cache, wird in CacheTime der Zeitpunkt angegeben, zu dem der Eintrag zuletzt mit DrvGetFileEntries abgefragt wurde. Befindet sich der Eintrag nicht im Cache, wird 0 übergeben. Der Wert kann von dem in bigint gewandelten jetzigen Zeitpunkt abgezogen werden, um das Alter des Cache-Eintrags zu ermitteln.
tCaltimeNow->vmSystemTime();
tNow # CnvBC(tCaltimeNow);
tInCacheTime # (tNow - tCacheTime) / 10000\b; // time in ms (rounded)
In FilePath und Custom01 befinden sich das zu lesende Verzeichnis und die benutzerdefinierten Informationen zu dem Verzeichnis. Wird das Wurzelverzeichnis abgefragt wird in FilePath '\' übergeben.
Der Laufwerkstreiber erwartet zunächst eine Nachricht mit Informationen, ob sich der Inhalt des Verzeichnisses geändert hat und einem Timeout. Für jeden Verzeichniseintrag wird eine weitere Nachricht gesendet. Das Timeout bestimmt, wann die Verzeichniseinträge erneut ermittelt werden sollen.
- Response
MessageId_DrvResGetFileEntries- Id der Antwort
ItemHeader_DrvItemHeader- Kopf des Datenpakets
ProtocolId0xF3A49E52- Id des verwendeten Protokolls
ProtocolVersion0x00040000- Version des verwendeten Protokolls
ItemContentChanged_DrvItemContentChanged- Informationsbereich für Änderungen
ContentChangedItemTimeout_DrvItemTimeout- Informationsbereich für den Timeout
Timeoutint- Maximale Zeit bis zur nächsten Abfrage des Verzeichnisinhaltes (in Millisekunden)
ItemResult_DrvItemResult- Informationsbereich für das Ergebnis
Timeout
Wird in diesen Datenpaket ContentChanged =false angegeben, werden alle Informationen aus dem Cache gelesen. Hat sich der Inhalt des Verzeichnisses geändert, müssen alle Verzeichniseinträge einschließlich aller Berechtigungen übertragen werden.
Erfolgt eine weitere Abfrage des Verzeichnisinhaltes, bevor der Timeout abgelaufen ist, wird kein Ereignis ausgelöst, sondern der Inhalt aus dem Cache erneut zur Verfügung gestellt.
Für jeden Eintrag in dem Verzeichnis wird eine eigene Nachricht versendet:
- Response
MessageId_DrvResGetFileEntyData- Id der Antwort
ItemResult_DrvItemResult- Informationsbereich des Ergebnisses
Resultint- Ergebnis der Operation
ItemFileName_DrvItemFileName- Informationsbereich für Dateinamen
FileNamealpha- Dateiname
ItemFileCustom_DrvItemFileCustom- Informationsbereich für den Programmierer
Custom01alpha- Benutzerdefinierte Informationen
ItemFileSize_DrvItemFileSize- Informationsbereich für die Dateigröße
FileSizebigint- Größe der Datei (in Bytes)
ItemFileAttributes_DrvItemFileAttributes- Informationsbereich für die Dateiattribute
FileAttributesint- Dateiattribute
ItemFileTime_DrvItemFileTime- Informationsbereich für Dateidatum und -uhrzeit
CreationTimebigint- Datum und Uhrzeit der Dateierstellung
LastAccessTimebigint- Datum und Uhrzeit des letzten Dateizugriffs
LastWriteTimebigint- Datum und Uhrzeit der letzten Änderung
ItemFileSubData_DrvItemFileSubData- Informationsbereich für weitere Daten
EmptyItemFileAuthorisation_DrvItemFileAuthorisation- Informationsbereich für die Dateiberechtigungen
UserIdint- Zugriffs-Id
Authorisationint- Berechtigungen an der Datei (siehe Text)
Das Datenpaket für einen Verzeichniseintrag beinhaltet folgende Informationen:
-
ItemFileNameIn
FileNamewird der Dateiname oder der Name des Unterverzeichnisses angegeben, der angezeigt werden soll. -
ItemFileCustomDer Bereich ist optional. In
Custom01können benutzerspezifische Informationen zu der Datei angegeben werden. Die Informationen werden nur dann geändert, wenn dieser Bereich im Antwortdatenpaket enthalten ist. Zum Löschen der benutzerdefinierten Daten muss ein Leerstring angegeben werden. -
ItemFileSizeFileSizebeinhaltet die Größe der Datei (in Bytes). Bei der Rückgabe von Unterverzeichnissen darf dieser Bereich nicht angegeben werden. -
ItemFileAttributesIn
FileAttributeswerden die Attribute der Datei oder des Unterverzeichnisses angegeben. Der Wert kann aus folgenden Konstanten kombiniert werden:_FsiAttrHidden: Versteckte Datei_FsiAttrSystem: Systemdatei_FsiAttrDir: Verzeichnis_FsiAttrArchive: Archivdatei
-
ItemFileTimeIn diesem Bereich wird das Datum und die Uhrzeit der Dateierstellung (
CreationTime), des letzten Zugriffs (LastAccessTime) und der letzten Änderung (LastWriteTime) angegeben. Die Werte werden als Zeitstempel übergeben. Die Berechnung des Zeitstempels kann wie folgt durchgeführt werden:tSystemCalTime->vmSystemTime();
tDrvMsxWrite->MsxWrite(_MsxData, CnvBC(tSystemCalTime));Bei der Umwandlung wird die Zeitzone berücksichtigt.
-
ItemFileSubDataIn
Emptywird angegeben, ob ein Unterverzeichnis leer ist, d. h. ob in dem Verzeichnis Dateien und/oder weitere Unterverzeichnisse vorhanden sind. Wirdtrueangegeben, ist das Verzeichnis leer. Der Bereich darf für Dateieinträge nicht angegeben werden. -
ItemFileAuthorisationDer Bereich
ItemFileAuthorisationmuss für jede Zugriffs-Id angegeben werden. Können sich Benutzer mit zwei unterschiedlichen Zugriffs-Ids anmelden (siehe DrvLoginDomainUser), müssen hier zwei Bereiche mit den entsprechenden Berechtigungen angegeben werden. Die Berechtigungen werden als ODER-Kombination folgender Konstanten übergeben:_DrvAuthAll: Alle Rechte vorhanden_DrvAuthNone: Keine Rechte vorhanden_DrvAuthList: Dateien und Verzeichnisse listen_DrvAuthDelete: Dateien und Verzeichnisse löschen_DrvAuthRename: Dateien und Verzeichnisse umbenennen_DrvAuthMove: Dateien und Verzeichnisse verschieben_DrvAuthSetAttributes: Attribute von Dateien und Verzeichnissen setzen_DrvAuthRead: Datei lesen_DrvAuthWrite: Datei schreiben_DrvAuthExecute: Datei ausführen_DrvAuthCreateDirectory: Verzeichnis erstellen_DrvAuthCreateFile: Datei erstellen
-
ItemResultDer Wert
Resultmuss auf_ErrOkgesetzt werden. Beim letzten Eintrag wird hier_rNoRecangegeben.
Beispiel:
if (tDrvRequestMessageId = _DrvReqGetFileEntries)
{
tDrvMsxWrite # MsxOpen(_MsxSocket | _MsxWrite, tSck);
tDrvMsxWrite->MsxWrite(_MsxMessage, _DrvResGetFileEntries);
tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemHeader); // ItemHeader
tDrvMsxWrite->MsxWrite(_MsxData, 0xF3A49E52); // ProtocolId
tDrvMsxWrite->MsxWrite(_MsxData, 0x00040000); // ProtocolVersion
tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemContentChanged); // content had changed
tDrvMsxWrite->MsxWrite(_MsxData, true);
tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemTimeout); // set timeout to 10 sec.
tDrvMsxWrite->MsxWrite(_MsxData, 10000);
// Message for first entry
tDrvMsxWrite->MsxWrite(_MsxMessage, _DrvResGetFileEntryData);
tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemFileName); // file name
tDrvMsxWrite->MsxWrite(_MsxData, StrCnv(StrCnv('First Entry', _StrToUTF8), _StrFromANSI));
tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemFileCustom); // no custom data
tDrvMsxWrite->MsxWrite(_MsxData, '');
tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemFileSize); // set file size
tDrvMsxWrite->MsxWrite(_MsxData, tImportedFile->FsiSize64());
tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemFileAttributes); // set attributes
tDrvMsxWrite->MsxWrite(_MsxData, _FsiAttrArchive);
tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemFileTime); // set file time
tDrvMsxWrite->MsxWrite(_MsxData, tFileCreationTime);
tDrvMsxWrite->MsxWrite(_MsxData, tFileAccessTime);
tDrvMsxWrite->MsxWrite(_MsxData, tFileModifyTime);
// tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemFileSubData); // set sub data
// tDrvMsxWrite->MsxWrite(_MsxData, false);
tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemFileAuthorisation); // user authorisation for admins
tDrvMsxWrite->MsxWrite(_MsxData, 10);
tDrvMsxWrite->MsxWrite(_MsxData, _DrvAuthAll); // all rights
tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemFileAuthorisation); // user authorisation for everybody else
tDrvMsxWrite->MsxWrite(_MsxData, 12);
tDrvMsxWrite->MsxWrite(_MsxData, _DrvAuthList | _DrvAuthRead); // read only
tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemResult); // Write result
tDrvMsxWrite->MsxWrite(_MsxData, _ErrOk);
tDrvMsxWrite->MsxWrite(_MsxEnd, 0);
...
// Message for last entry
tDrvMsxWrite->MsxWrite(_MsxMessage, _DrvResGetFileEntryData);
tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemFileName); // file name
tDrvMsxWrite->MsxWrite(_MsxData, StrCnv(StrCnv('First Entry', _StrToUTF8), _StrFromANSI));
tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemFileCustom); // no custom data
tDrvMsxWrite->MsxWrite(_MsxData, '');
tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemFileSize); // set file size
tDrvMsxWrite->MsxWrite(_MsxData, tImportedFile->FsiSize64());
tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemFileAttributes); // set attributes
tDrvMsxWrite->MsxWrite(_MsxData, _FsiAttrArchive);
tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemFileTime); // set file time
tDrvMsxWrite->MsxWrite(_MsxData, tFileCreationTime);
tDrvMsxWrite->MsxWrite(_MsxData, tFileAccessTime);
tDrvMsxWrite->MsxWrite(_MsxData, tFileModifyTime);
// tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemFileSubData); // set sub data
// tDrvMsxWrite->MsxWrite(_MsxData, false);
tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemFileAuthorisation); // user authorisation for admins
tDrvMsxWrite->MsxWrite(_MsxData, 10);
tDrvMsxWrite->MsxWrite(_MsxData, _DrvAuthAll); // all rights
tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemFileAuthorisation); // user authorisation for everybody else
tDrvMsxWrite->MsxWrite(_MsxData, 12);
tDrvMsxWrite->MsxWrite(_MsxData, _DrvAuthList | _DrvAuthRead); // read only
tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemResult); // Write result
tDrvMsxWrite->MsxWrite(_MsxData, _rNoRec);
tDrvMsxWrite->MsxWrite(_MsxEnd, 0);
tDrvMsxWrite->MsxClose();
}