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.