DrvReadFile
DrvReadFile
Aufruf beim Lesen einer Datei
Details
- Request
MessageId:_DrvReqReadFileId 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 der 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 wurdeItemTempPath:_DrvItemTempPathInformationsbereich für den temporären PfadTempPath:alphaPfad und Dateiname im temporären Pfad- Siehe: Verwandte Befehle
Dieses Ereignis wird ausgelöst, wenn eine Datei gelesen wird. In dem Bereich ItemAuthUserDomain wird der Benutzer und die Domäne des beim Betriebssystem angemeldeten Benutzers übergeben. In FilePath und Custom01 befinden sich der Pfad und Dateiname auf dem Laufwerk und die benutzerdefinierten Informationen der Datei. 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 der Datei muss in das temporäre Verzeichnis ausgelagert werden. Das Laufwerk und der Pfad dazu befindet sich in TempPath.
Über die Prüfsumme kann der Programmierer entscheiden, ob sich die Datei in der Zwischenzeit geändert hat und neu übertragen werden muss.
Das Antwort-Datenpaket darf erst versendet werden, wenn die Informationen vollständig zur Verfügung stehen.
Der Laufwerkstreiber erwartet folgendes Datenpaket als Antwort:
- Response
MessageId_DrvResReadFile- Id der Antwort
ItemHeader_DrvItemHeader- Kopf des Datenpakets
ProtocolId0xF3A49E52- Id des verwendeten Protokolls
ProtocolVersion0x00040000- Version des verwendeten Protokolls
ItemContentChanged_DrvItemContentChanged- Informationsbereich für geänderte Inhalte
ContentChangedItemFileCustom_DrvItemFileCustom- Informationsbereich für benutzerdefinierte Daten (optional)
Custom01alpha- Benutzerdefinierte Informationen
ItemFileHash_DrvItemFileHash- Informationsbereich der Prüfsumme
FileHashalpha- Hash der gespeicherten Datei
ItemFileContentDisk_DrvItemFileContentDisk- Informationsbereich für den Inhalt der Datei
FilePathalpha- Pfad und Dateiname der Datei im temporären Pfad
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
ItemResult_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 ist. 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.
Die Bereiche ItemFileHash und ItemFileContentDisk müssen nur dann angegeben werden, wenn sich der Inhalt der Datei geändert hat, also im Antwortpaket ContentChanged auf true gesetzt ist. Das ItemFileHash kann beim nächsten Aufruf von DrvOpenFile und DrvReadFile verwendet werden, um zu prüfen, ob die Datei verändert wurde.
Die Datei wird nur dann gelesen, wenn in Result _ErrOk (0) angegeben wird. Durch das Setzen eines _ErrFsi...-Wertes können andere Fehlerzustände übermittelt werden.
Beispiel:
if (tDrvRequestMessageId = _DrvReqReadFile)
{
tDrvMsxWrite # MsxOpen(_MsxSocket | _MsxWrite, tSck);
tDrvMsxWrite->MsxWrite(_MsxMessage, _DrvResReadFile);
tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemHeader); // ItemHeader
tDrvMsxWrite->MsxWrite(_MsxData, 0xF3A49E52); // ProtocolId
tDrvMsxWrite->MsxWrite(_MsxData, 0x00040000); // ProtocolVersion
tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemContentChanged); // content changed?
tDrvMsxWrite->MsxWrite(_MsxData, false);
tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemFileCustom); // no custom information
tDrvMsxWrite->MsxWrite(_MsxData, '');
// ... Export new information to tFileName
// tFileName # tRequestTempPath + '\' + ...;
// tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemFileHash); // changed file hash
// tDrvMsxWrite->MsxWrite(_MsxData, StrCnv(StrCnv(FsiFileInfo(tFileName, _FsiFileRMD160), _StrToUtf8), _StrFromAnsi);
// tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemFileContentDisk); // path and filename
// tDrvMsxWrite->MsxWrite(_MsxData, tFileName);
// 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, _DrvItemResult); // Write result
tDrvMsxWrite->MsxWrite(_MsxData, _ErrOk);
tDrvMsxWrite->MsxWrite(_MsxEnd, 0);
tDrvMsxWrite->MsxClose();
}