Zum Hauptinhalt springen

DrvGetFileEntries

DrvGetFileEntries

Aufruf beim Lesen eines Ordners

Details

  • Request
  • MessageId: _DrvReqGetFileEntries Id des Ereignisses
  • ItemHeader: _DrvItemHeader Kopf des Datenpakets
  • ProtocolId: 0xF3A49E52 Id des verwendeten Protokolls
  • ProtocolVersion: 0x00040000 Version des verwendeten Protokolls
  • ItemAuthUserDomain: _DrvItemAuthUserDomain Informationsbereich Benutzerauthentifizierung
  • UserName: alpha Name des Benutzers
  • DomainName: alpha Name der Domain
  • ItemCacheTime: _DrvItemCacheTime Informationsbereich für die Cache-Nutzung
  • CacheTime: bigint 0 oder der Zeitpunkt, zu dem der Eintrag zuletzt abgefragt wurde
  • ItemFilePath: _DrvItemFilePath Informationsbereich des Verzeichnisses
  • FilePath: alpha Pfad des Verzeichnisses (ohne Laufwerksbuchstabe)
  • ItemFileCustom: _DrvItemFileCustom Informationsbereich für den Programmierer
  • Custom01: alpha Benutzerdefinierte Informationen
  • Siehe: Verwandte Befehle

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
  • ProtocolId
    • 0xF3A49E52
    • Id des verwendeten Protokolls
  • ProtocolVersion
    • 0x00040000
    • Version des verwendeten Protokolls
  • ItemContentChanged
  • ContentChanged
  • ItemTimeout
  • Timeout
    • int
    • Maximale Zeit bis zur nächsten Abfrage des Verzeichnisinhaltes (in Millisekunden)
  • ItemResult
  • Timeout
    • int
    • Bei einem Resultat ungleich 0 ( _ErrOk ) werden keine Verzeichniseinträge übertragen

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
  • Result
    • int
    • Ergebnis der Operation
  • ItemFileName
  • FileName
  • ItemFileCustom
  • Custom01
    • alpha
    • Benutzerdefinierte Informationen
  • ItemFileSize
  • FileSize
    • bigint
    • Größe der Datei (in Bytes)
  • ItemFileAttributes
  • FileAttributes
    • int
    • Dateiattribute
  • ItemFileTime
  • CreationTime
    • bigint
    • Datum und Uhrzeit der Dateierstellung
  • LastAccessTime
    • bigint
    • Datum und Uhrzeit des letzten Dateizugriffs
  • LastWriteTime
    • bigint
    • Datum und Uhrzeit der letzten Änderung
  • ItemFileSubData
  • Empty
  • ItemFileAuthorisation
  • UserId
    • int
    • Zugriffs-Id
  • Authorisation
    • int
    • Berechtigungen an der Datei (siehe Text)

Das Datenpaket für einen Verzeichniseintrag beinhaltet folgende Informationen:

  • ItemFileName In FileName wird der Dateiname oder der Name des Unterverzeichnisses angegeben, der angezeigt werden soll.

  • ItemFileCustom Der Bereich ist optional. In Custom01 kö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.

  • ItemFileSize FileSize beinhaltet die Größe der Datei (in Bytes). Bei der Rückgabe von Unterverzeichnissen darf dieser Bereich nicht angegeben werden.

  • ItemFileAttributes In FileAttributes werden 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

  • ItemFileTime In 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.

  • ItemFileSubData In Empty wird angegeben, ob ein Unterverzeichnis leer ist, d. h. ob in dem Verzeichnis Dateien und/oder weitere Unterverzeichnisse vorhanden sind. Wird true angegeben, ist das Verzeichnis leer. Der Bereich darf für Dateieinträge nicht angegeben werden.

  • ItemFileAuthorisation Der Bereich ItemFileAuthorisation muss 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

  • ItemResult Der Wert Result muss auf _ErrOk gesetzt werden. Beim letzten Eintrag wird hier _rNoRec angegeben.

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();
}