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.