DrvOpenFile
DrvOpenFile
Aufruf beim Öffnen einer Datei
Details
- Request
MessageId:_DrvReqOpenFileId des EreignissesItemHeader:_DrvItemHeaderKopf des DatenpaketsProtocolId:0xF3A49E52Id des verwendeten ProtokollsProtocolVersion:0x00040000Version des verwendeten ProtokollsItemAuthUserDomain:_DrvItemAuthUserDomainInformationsbereich des am Betriebssystem angemeldeten BenutzersUserName:alphaName des angemeldeten BenutzersDomainName:alphaDomäne des angemeldeten BenutzersItemFilePath:_DrvItemFilePathInformationsbereich für die DateiFilePath:alphaPfad und Dateiname (ohne Laufwerksbuchstabe)ItemFileCustom:_DrvItemFileCustomInformationsbereich für benutzerdefinierte DatenCustom01:alphaBenutzerdefinierte InformationenItemFileHash:_DrvItemFileHashInformationsbereich der PrüfsummeFileHash:alphaPrüfsumme der DateiItemCacheTime:_DrvItemCacheTimeInformationsbereich für die Cache-NutzungCacheTime:bigint0oder der Zeitpunkt, zu dem die Datei zuletzt abgefragt wurdeItemFileAccess:_DrvItemFileAccessInformationsbereich für die ZugriffsartFsiFlags:intZugriffsart (siehe Text)- Siehe: Verwandte Befehle
Dieses Ereignis wird aufgerufen, wenn eine Datei auf dem Laufwerk mit Lese- und/oder Schreibzugriff geöffnet wird. In dem Request wird der am Betriebssystem angemeldete Benutzer übergeben. In FilePath befindet sich der Pfad (ohne Laufwerksbuchstaben) und der Dateiname der geöffneten Datei. Wurden der Datei benutzerspezifische Informationen zugeordnet, befinden sich diese in Custom01. In FileHash wird die Prüfsumme der Datei übertragen, die beim letzten Aufruf von DrvReadFile gesetzt wurde. Befindet sich die Datei bereits im Cache, wird in CacheTime der Zeitpunkt angegeben, zu dem die Datei zuletzt mit DrvReadFile abgefragt wurde. Befindet sich die Datei nicht im Cache, wird 0 übergeben. Der Inhalt von FsiFlags kann mit folgenden Konstanten, oder Kombinationen davon, verglichen werden:
_FsiAcsR: nur Lesezugriff_FsiAcsW: nur Schreibzugriff_FsiAcsRW: Lese- und Schreibzugriff_FsiDenyNone: kein exklusiver Zugriff_FsiStdRead: Standard-Lesemodus_FsiStdWrite: Standard-Schreibmodus
Über die Prüfsumme oder den Cache-Zeitpunkt kann der Programmierer entscheiden, ob sich die Datei in der Zwischenzeit geändert hat und neu übertragen werden muss. Ist das der Fall, muss in der Response im Item ItemContentChanged der Wert true übermittelt werden. Anschließend wird das Ereignis DrvReadFile ausgelöst, um den Dateiinhalt neu zu übertragen.
- Response
MessageId_DrvResOpenFile- Id der Antwort
ItemHeader_DrvItemHeader- Kopf des Datenpakets
ProtocolId0xF3A49E52- Id des verwendeten Protokolls
ProtocolVersion0x00040000- Version des verwendeten Protokolls
ItemFileCustom_DrvItemFileCustom- Informationsbereich für benutzerdefinierte Daten (optional)
Custom01alpha- Benutzerdefinierte Informationen
ItemFileSize_DrvItemFileSize- Informationsbereich der Dateigröße (optional)
FileSizebigint- Größe der Datei (in Bytes)
ItemFileAttributes_DrvItemFileAttributes- Informationsbereich für Dateiattribute (optional)
FileAttributesint- Dateiattribute
ItemFileTime_DrvItemFileTime- Informationsbereich für Dateidatum und -uhrzeit (optional)
CreationTimebigint- Zeitstempel der Erzeugung der Datei
LastAccessTimebigint- Zeitstempel des letzten Zugriffs
LastWriteTimebigint- Zeitstempel der letzten Änderung
ItemFileAuthorisation_DrvItemFileAuthorisation- Informationsbereich für Berechtigungen (optional)
UserIdint- Zugriffs-Id
Authorisationint- Berechtigungen
ItemContentChanged_DrvItemContentChanged- Informationsbereich für geänderte Inhalte
ContentChangedItemResult_DrvItemResult- Ergebnis-Bereich
Resultint- Ergebniswert
Die Bereiche ItemFileCustom, ItemFileSize, ItemFileAttributes, ItemFileTime und ItemFileAuthorisation sind optional. Die Informationen werden nur dann geändert, wenn diese Bereiche im Antwortdatenpaket enthalten sind. Zum Löschen der Daten muss ein Leerstring oder 0 (für die int-Werte) angegeben werden. Bei ItemFileTime muss immer ein gültiger Zeitstempel angegeben werden, wenn dieser gesetzt wird.
Der Bereich ItemContentChanged muss zurückgegeben werden. Dieses Item bestimmt, ob die Datei geändert wurde. Das Ereignis DrvReadFile wird nur ausgelöst, wenn true übertragen wird. Mit Hilfe der Items ItemCacheTime und ItemFileHash aus dem Request kann ermittelt werden, ob in dem Bereich true oder false übertragen werden muss.
Die Datei wird nur dann geöffnet, wenn in Result _ErrOk (0) angegeben wird. Durch das Setzen eines _ErrFsi...-Wertes können andere Fehlerzustände übermittelt werden.
Beispiel:
if (tDrvRequestMessageId = _DrvReqOpenFile)
{
tDrvMsxWrite # MsxOpen(_MsxSocket | _MsxWrite, tSck);
tDrvMsxWrite->MsxWrite(_MsxMessage, _DrvResOpenFile);
tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemHeader); // ItemHeader
tDrvMsxWrite->MsxWrite(_MsxData, 0xF3A49E52); // ProtocolId
tDrvMsxWrite->MsxWrite(_MsxData, 0x00040000); // ProtocolVersion
tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemFileCustom); // no custom data
tDrvMsxWrite->MsxWrite(_MsxData, '');
// File size
tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemFileSize); // set file size
tDrvMsxWrite->MsxWrite(_MsxData, tImportedFile->FsiSize64());
tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemFileAttributes); // set same attributes
tDrvMsxWrite->MsxWrite(_MsxData, tRequestFileAttributes);
tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemFileTime); // set file time
tDrvMsxWrite->MsxWrite(_MsxData, tRequestFileCreationTime);
tCalSystemTime->vmSystemTime();
tDrvMsxWrite->MsxWrite(_MsxData, CnvBC(tCalSystemTime));
tDrvMsxWrite->MsxWrite(_MsxData, CnvBC(tCalSystemTime));
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, _DrvItemContentChanged); // file content changed?
tDrvMsxWrite->MsxWrite(_MsxData, true);
tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemResult); // Write result
tDrvMsxWrite->MsxWrite(_MsxData, _ErrOk);
tDrvMsxWrite->MsxWrite(_MsxEnd, 0);
tDrvMsxWrite->MsxClose();
}