Home » Tutorials » Datenspeicherung » Archivformate – Cabinet-API

Archivformate – Cabinet-API

Cabinet oder nicht?

Zum Testen, ob eine Datei ein gültiges Archiv darstellt, hat Microsoft die Funktion FDIIsCabinet implementiert.

FDIIsCabinet (hfdi : HFDI; hf : Integer; pfdici : TPFDICABINETINFO) : BOOL;

Der erste Parameter ist das von FDICreate erzeuge Handle. hf ist das Dateihandle und pfdici enthält die Archivinformationen.

TPFDICABINETINFO
cbCabinet Größe des Archivs in Byte.
cFolders Anzahl der Folder innerhalb des Archivs.
cFiles Anzahl der Dateien innerhalb des Archivs.
setID Archiv ID
iCabinet Nummer des Archives
fReserve true: Das archiv enthält Resrevierte Bereiche
hasprev true: Das Archiv hat einen Vorgänger.
hasnext true: Das Archiv hat einen Nachfolger.

Um eine Datei aus dem Archiv zu entnehmen muß die Funktion FDICopy verwendet werden.

function FDICopy (hfdi : HFDI; pszCabinet : PChar; pszCabPath : PChar;
 flags : Integer; pfnfdin : PFNFDINOTIFY; pfnfdid : PFNFDIDECRYPT;
 pvUser : PVoid): BOOL; cdecl;

hdfi sollte auf das von FDICreate zurückgegebene Handle gesetzt werden, pszCabinet gibt den Namen des Archivs an, pszCapPath das Zielverzeichnis.
Der Parameter Flags wird in der aktuellen Version des Cabinet SDK nicht verwendet und sollte auf 0 gesetzt werden. Dasselbe gilt für pfnfdid – jedoch ist in diesem Falle Nil zu übergeben.
Es bleibt noch die pfnfdin – die sogenannte Notify Funktion.

function Notify(fdint: TFDINOTIFICATIONTYPE;
 pfdin: PFDINOTIFICATION): Integer; cdecl;

Der Notificaten Type kann einen der folgenden Werte haben.

fdintCABINET_INFO

Wird vor jedem Öffnen einer Cabinet Datei aufgerufen. Die Struktur pfdin enthält folgende Werte:

psz1 Dateiname der nächsten Datei
psz2 Bezeichnung der nächsten Datei
psz3 Dateiname der aktuellen Datei.
iCabinet Nummer der nächsten Datei
setID Die ID der aktuellen Datei.

Der Rückgabewert muss größer als -1 sein.

fdintPARTIAL_FILE

Wird aufgerufen wenn sich in der Cabinet Datei eine Datei befindet die nicht auf ihr startet.

psz1 Dateiname der aktuellen Datei
psz2 Dateiname der Cabinet auf der die Datei beginnt.
psz3 Bezeichnung der Cabinet auf der die Datei beginnt.
iCabinet Nummer der nächsten Datei
setID Die ID der aktuellen Datei.

Der Rückgabewert muss größer als -1 sein.

fdintCOPY_FILE

Die wohl wichtigste Funktion. Sie wird für alle Dateien die innerhalb der gegebenen Cabinet Datei anfangen einmal aufgerufen. Wenn die Datei dekomprimiert werden soll, so muß ein gültiges Dateihandle zurückgegeben werden. Soll die Datei nicht dekomprimiert werden, so muss der Rückgabewert Null sein.

psz1 Name der Datei im Archiv
cb Unkomprimierte Größe dieser Datei.
date Datum
time Uhrzeit
attribs Attribute
iFolder Index des Folders

fdintCLOSE_FILE_INFO

Die Datei kann wieder geschlossen werden. Diese Funktion sollte die Datei schließen, Datum, Uhrzeit und Attribute ggf. setzten.

psz1 Name der Datei im Archiv
hf Dateihandle
date Datum
time Uhrzeit
attribs Attribute
iFolder Index des Folders
cb Ist dieser Wert gleich 1 dann soll die Datei nach dem entpacken ausgeführt werden.

fdintNEXT_CABINET

Eine Cabinet Datei wurde vollständig gelesen. Nun muss die nächste Datei eingelesen werden. Falls sich diese auf einem anderen Datenträger befindet, bietet diese Funktion die Möglichkeit eine entsprechenden Dialog einzublenden.

psz1 Dateiname der nächsten Datei
psz2 Bezeichnung der nächsten Datei
psz3 Dateiname und Pfad der aktuellen Datei.
fdie evtl. FDIERROR_WRONG_CABINET

fdie wird auf FDIERROR_WRONG_CABINET gesetzt, wenn zuvor schon einmal der Versuch unternommen wurde, die nächste Cabinet Datei zu finden – dies ist jedoch misslungen. Eine typische Situation ist die, dass sich die Datei auf einer Diskette im Laufwerk befand und der Benutzer irrtümlich eine falsche Diskette eingelegt hat. In einem solchen Fall sollte die Applikation einen Wiederholen/Abbrechen Dialog anzeigen.

fdintENUMERATE

bietet die Möglichkeiten des erweiterten Suchens. Kann von „normalen“ Anwendungen ignoriert werden. Setzen Sie pfdin.iFolder auf Null und geben Sie Eins zurück.