Home » Tutorials » Datenspeicherung » Archivformate – Cabinet-API

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;