Home » Tutorials » Datenspeicherung » Archivformate – Cabinet-API

Archivformate – Cabinet-API

Komprimierung

Ich widme mich nun zuerst einmal dem Komprimieren. Das FCI stellt dazu insgesamt 5 Funktionen bereit:

  • FCICreate
  • FCIAddFile
  • FCIFlushCabinet
  • FCIFlushFolder
  • FCIDestroy

Zuerst muss das FCI initialisiert werden. Dies geschieht durch die Funktion FCICreate. Die einzelnen Parameter und ihrer Bedeutung können Sie der folgenden Tabelle entnehmen.

FCICreate
perf Record für die Rückgabe evtl. Fehlercodes
pfnfcifp Callback: Funktion für die Übermittlung des Zieles einer Datei.
pfna Callback: Speicher anfordern
pfnf Callback: Speicher freigeben
pfnopen Callback: Datei öffnen
pfnread Callback: Daten lesen
pfnwrite Callback: Daten schreiben
pfnclose Callback: Datei schließen
pfnseek Callback: Positionszeiger versetzten.
pfnfcigtf Generator für Temporäre Dateinamen
pccab Informationen über das Cabinet File.
pv Selbstdefinierbarer Zeiger

Nun ist noch die pccab Struktur zu initialisieren. Sie enthält alle notwendigen Informationen die zur Erstellung der Cabinet Datei notwendig sind.

Informationen über das Cabinet
cb Größe die das Cabinet maximal Annehmen darf.
cbFolderThresh Schwelle ab der ein neuer "Ordner" innerhalb des Archivs erzeugt wird.
ICab, iDisk Nummer der Cabinet Datei / Diskette
setID ID der Cabinet Datei
szDisk Bezeichnung der Diskette
szCab Bezeichnung der Cabinet Datei
szCabPath Pfad für szCab
with Cab do
begin
  cb := $FFFFFF;
  cbFolderThresh := $FFFFFF;
  szDisk := 'Disk No. 1';
  szCab  := 'Cabinet1.cab';
  szCabPath := 'C:';
  iCab  := 1;
  SetId := 31411;
end;

CabHandle := FCICreate(Error,FilePlaced,FCAllocMem,FCFreeMem,FCOpenFile, FCReadFile,
FCWriteFile, FCCloseFile, FCSeekFile, FCDeleteFile, FCGetTempFile, @Cab, pv);

Dieser Code erzeugt eine Datei namens „Cabinet1.cab“ im Stammverzeichnis des Laufwerkes C. Die Elemente cb und cbFolderTresh sind auf relativ große Werte gesetzt – damit nicht mehr als eine Datei erzeugt wird. Die Felder iCab, iDisk und SetId werden in diesem Fall nicht benötigt. Sie sind nur von Bedeutung, wenn über mehrere Medien hinweg komprimiert werden soll. In diesem Falle enthält iCab die fortlaufende Nummer der erzeugen Cabinet Datei und iDisk die Nummer des beschriebenen Mediums.
Die einzige bei diesem Aufruf noch unbekannte Funktion ist FilePlaced. Sie hat die Struktur

function FilePlaced(pccab : PCCAB; pszFile : PChar; cbFile : Longint;
 fContinuation : Bool; pv : Pointer) : Integer;

pccab enthält die von Ihnen gesetzten Informationen, das pszFile ist der Name der gerade plazierten Datei, cbFile, dessen Größe und fContinuation gibt an, ob es sich um eine Fortsetzung eines anderen Archivs handelt.