DrvGetFileEntries
DrvGetFileEntries
Aufruf beim Lesen eines Ordners
Details
- Request
MessageId:_DrvReqGetFileEntriesId des EreignissesItemHeader:_DrvItemHeaderKopf des DatenpaketsProtocolId:0xF3A49E52Id des verwendeten ProtokollsProtocolVersion:0x00040000Version des verwendeten ProtokollsItemAuthUserDomain:_DrvItemAuthUserDomainInformationsbereich BenutzerauthentifizierungUserName:alphaName des BenutzersDomainName:alphaName der DomainItemCacheTime:_DrvItemCacheTimeInformationsbereich für die Cache-NutzungCacheTime:bigint0oder der Zeitpunkt, zu dem der Eintrag zuletzt abgefragt wurdeItemFilePath:_DrvItemFilePathInformationsbereich des VerzeichnissesFilePath:alphaPfad des Verzeichnisses (ohne Laufwerksbuchstabe)ItemFileCustom:_DrvItemFileCustomInformationsbereich für den ProgrammiererCustom01:alphaBenutzerdefinierte 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
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:
-
ItemFileNameInFileNamewird der Dateiname oder der Name des Unterverzeichnisses angegeben, der angezeigt werden soll. -
ItemFileCustomDer Bereich ist optional. InCustom01kö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. -
ItemFileAttributesInFileAttributeswerden 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.
-
ItemFileSubDataInEmptywird 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 BereichItemFileAuthorisationmuss 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 WertResultmuss 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();
}