Archivformate – Cabinet-API
AddFile
Nun soll das Archiv gefüllt werden. Dazu ist die Funktion FCIAddFile zuständig.
FCIAddFile | |
hfci | Das von FCICreate zurückgegeben Handle des Archivs. |
pszSourceFile | Datei die Hinzugefügt werden soll. |
pszFileName | Dateiname im Archiv |
fExecute | Dieses Flag gibt an ob die Datei ausgeführt werden soll nachdem sie extrahiert wurde. |
pfnfcignc | Callback: GetNextCab |
pfnfcis | Callback: Status |
pfnfcigoi | Callback: OpenInfo |
typeCompress | Art der Kompression: tcompTYPE_NONE oder tcompTYPE_MSZIP |
Die Callback Funktion GetNextCab wird immer dann aufgerufen wenn eine Cabinet Datei erschöpft ist und eine neue erstellt werden muss.
Die Status Funktion hat das Format
function (typeStatus : TUINT; cb1 : TULONG; cb2 : TULONG; pv : Pointer) : Longint;
Der typeStatus kann einen der folgenden Werte annehmen.
StatusFile
Eine Datei wurde dem Archiv hinzugefügt. Cb1 enthält die Größe der komprimierten Datei, cb2 die unkomprimierte.
statusFolder
Ein Ordner wurde dem Archiv hinzugefügt.
statusCabinet
Ein komplettes Archiv soll auf den Datenträger geschrieben werden. In diesem Fall muß der Rückgabewert größer oder gleich wie cb2 sein. Wobei cb2 die momentane Größe des Archivs enthält.
In allen anderen Fällen sollte der Rückgabewert 0 sein.
Über die callback Funktion openinfo holt sich die Cabinet API Informationen über die zu hinzufügende Datei.
function OpenInfo(pszName : PChar; var pdate : TUSHORT; var ptime : TUSHORT; var pattribs: TUSHORT; err: PInteger; pv: Pointer): Integer; cdecl;
Der Rückgabewert ist ein Handle auf die geöffnete Datei. Die Parameter pdate, ptime und pattribs müssen die Dateiinformationen Datum, Uhrzeit und Attribute im FAT kompatiblem Format zurückliefen. Dazu muß auf die Win API zurückgegriffen werden.
function OpenInfo(pszName : PChar; var pdate : TUSHORT; var ptime : TUSHORT; var pattribs : TUSHORT; err : PInteger; pv : Pointer): Integer; cdecl; var Handle : Integer; TimeCreation : TFileTime; TimeDummy : TFileTime; begin Handle := CreateFile(pszName,GENERIC_READ,0,Nil,OPEN_EXISTING,0,0); if Handle>0 then begin GetFileTime(Handle,@TimeCreation,@TimeDummy,@TimeDummy); FileTimeToDosDateTime(TimeCreation,Word(pdate),Word(ptime)); CloseHandle(Handle); Result := FCOpenFile(pszName,0,0,err,Nil); end else Result := -1; end;