Dieser Artikel beschreibt die Dekomprimierung mit der UnRAR Bibliothek von Eugene Roshal - dem Erfinder des RAR Formates. Das Archivformat RAR ist ein relativ junges System aber sehr leistungsstarkes System. Besonders bei großen Archiven sollte RAR ernsthaft in Betracht gezogen
werden.
Zuerst muss das Archiv geöffnet werden. Dazu wird die Funktion RAROpenArchive und die zugehörige Struktur TRAROpenArchive
verwendet.
function RAROpenArchive(ArchiveData: PRAROPENARCHIVEDATA): THandle;
TRAROpenArchiveData
| ArcName |
Name und Pfad des zu bearbeitenden Archives. |
| OpenMode |
| RAR_OM_LIST |
Das Archiv ausschließlich zum auslesen der Archivinformationen
öffnen. |
| RAR_OM_EXTRACT |
Öffnen zum dekomprimieren der Dateien. |
|
| OpenResult |
(Rückgabewert) Bei Erfolg 0 - sonst der entsprechende Fehlercode. |
| CmtBuf |
Zeiger auf den Anfang eines Speicherblocks der einen in dem Archiv
gespeicherten Kommentar aufnehmen soll. |
| CmtSize |
Größe des Speicherblockes in Bytes. |
| CmtState |
(Rückgabewert) Falls kein Kommentar vorhanden ist
wird eine Null zurückgeliefert - eine Eins bedeutet das der Kommentar
vollständig eingelesen worden ist. Die Bedeutung anderer Werte sind
den Fehlercodes zu entnehmen. |
Nach dem Öffnen des Archives befindet sich der Dateizeiger auf
der ersten Datei im Archiv. Informationen über diese Datei ließt
die Funktion RARReadHeader aus. Mit der Funktion RARProcessFile kann man
den Dateizeiger innerhalb des Archives versetzten.
function RARReadHeader(hArcData: THandle; var
HeaderData: TRARHeaderData): Integer;
TRARHeaderData
| ArcName |
Name des Archives |
| FileName |
Dateiname |
| Flags |
Datei Flags |
| PackSize |
Dateigröße komprimiert |
| UnpSize |
Dateigröße unkomprimiert |
| HostOS |
Das zum Archivieren verwendete Betriebssystem.
0 - DOS
1 - IBM OS/2
2 - Windows
3 - Unix |
| FileCRC |
CRC der unkomprimierten Datei |
| FileTime |
Datum und Uhrzeit der Datei im MS-DOS Format. |
| UnpVer |
Die RAR Version die mindestens benötigt wird um die Datei zu entpacken. |
| Method |
Die zum Archivieren verwendete Methode |
| FiltAttr |
Dateiattribute im MS-DOS Format. |
| CmtBuf |
(Eingabe) Zeiger auf den Anfang des Speicherblocks der einen
gespeicherten Kommentar aufnehmen soll. |
| CmtBufSize |
(Eingabe) Größe des Speicherblockes in Bytes. |
| CmtSize |
Größe des tatsächlich verwenden Speichers in Bytes. |
| |
Rückgabewert der Funktion. Eine Null bedeutet das kein Kommentar
vorhanden war und der Speicherblock somit wieder freigegeben werden kann,
eine Eins bedeutet das die Kommentare vollständig eingelesen worden sind. |
Datei Flags
Die Bits 8-31 der Integers Flag sind reserviert. Die Bits 5,6 und 7 geben
die Größe des Dictionary (wird nur intern verwendet) an. Interessant
sind diese Bits nur wenn sie alle gesetzt sind - dies bedeutet das die
Datei ein Verzeichnis darstellt.
Wichtig sind die Bits 0-4:
- Bit 0: Die Datei ist eine Fortsetzung aus einem vorangegangen
Datenträger.
- Bit 1: Die Datei wird auf dem nächsten Datenträger fortgesetzt.
- Bit 2: Die Datei ist durch ein Passwort verschlüsselt.
- Bit 3: Zu der gegebenen Datei ist ein Kommentar vorhanden.
- Bit 4: Die Komprimierungsmethode der vorangegangen Dateien wird verwendet.
Um nun die Datei aus dem Archiv zu entnehmen oder einfach den Dateizeiger
eine Datei weiter wandern zu lassen muss die Funktion RARProcessFile verwenden
werden.
function RARProcessFile(hArcData: THandle; Operation: Integer;
DestPath: PChar; DestName: PChar): Integer;
hArcData ist das von RAROpenArchive zurückgelieferte Archivhandle.
Der Parameter Operation kann einen der folgenden Werte annehmen:
| RAR_SKIP |
Bewegt den Dateizeiger auf die nächste Datei innerhalb des Archives. |
| RAR_TEST |
Testet die aktuelle Datei und setzt den Dateizeiger auf die nächste
Datei innerhalb des Archives. |
| RAR_EXTRACT |
Entpacke eine Datei aus dem Archiv. Falls das Archiv nicht für
das entpacken von Dateien geöffnet worden ist (also RAR_OM_LIST) dann
ist RAR_EXTRACT aquivalent zu RAR_SKIP. |
DestName und DestPath sind nur beim dekomprimieren von Bedeutung. DestName
gibt den Namen und Pfad der Zieldatei an. Nur wenn DestName Nil ist
kommt DestPath in Spiel. In diesem Fall wird der Dateiname aus dem Archiv
entnommen und mit DestPath kombiniert. Sollte auch DestPath Nil
sein so wird der aktuelle Pfad zur Bildung der Zieldatei verwendet.
Wie oben beschreiben können Dateien durch ein Passwort gesichert
werden. Mit Hilfe der Funktion RARSetPassword kann man der UnRAR Bibliothek
das benötigte Passwort übergeben.
function RARSetChangeVolProc(hArcData: THandle;
ChangeVolProc: TChangeVolProc);
Diese Funktion setzt eine benutzerdefinierte Funktion vom Typ TProcessDataProc
die aufgerufen wird sobald ein Datenträgerwechsel vorgenommen werden
muss.
TChangeVolProc = function(ArcName: PChar;
Mode: Integer): Integer;
ArcName bezeichnet den Namen des nächsten benötigen Datei. Mode
ist entweder RAR_VOL_ASK oder RAR_VOL_NOTIFY.
Wenn Mode RAR_VOL_ASK ist dann sollte ein Dialog mit der Aufforderung
den neuen Datenträger einzulegen angezeigt werden. Die Funktion muss
einen Wert ungleich Null zurück liefern um der UnRAR Bibliothek mitzuteilen
das ein neuer Versuch unternommen werden soll das Archiv vom nächsten
Datenträger aus fortzusetzen. Ein Rückgabewert von Null bedeutet
Abbruch.
function RARSetProcessDataProc(hArcData: THandle;
ProcessDataProc: TProcessDataProc);
TProcessDataProc = function(Addr: PByte; Size:
Integer): Integer;
Diese Funktionen können zum Anzeigen des Fortschritts verwendet werden.
Addr bezeichnet die Adresse in der sich die unkomprimierten Daten befinden.
Size ist die größe der unkomprimierten Daten. Diese Funktion
sollte einen Wert ungleich Null zurückgeben. Ein Rückgabewert
von Null bedeutet Abbruch.
Zuguterletzt muss das Archiv wieder geschlossen werden.
RARCloseArchive(hArcData: THandle);
Fehlercodes
| ERAR_NO_MEMORY |
Die Bibliothek konnte nicht ausreichend Speicher anfordern. |
| ERAR_EOPEN |
Eine Datei konnte nicht geöffnet werden. |
| ERAR_ECREATE |
Eine Datei konnte nicht erstellt werden. |
| ERAR_ECLOSE |
Eine Datei konnte nicht geschlossen werden. |
| ERAR_EREAD |
Fehler beim lesen aus einer Datei. |
| ERAR_EWRITE |
Fehler beim schreiben in eine Datei. |
| ERAR_BAD_DATA |
Das Archiv enthielt ungültige Daten. |
| ERAR_BAD_ARCHIVE |
Die angegebene Datei ist kein gültiges RAR Archiv. |
| ERAR_UNKNOWN_FORMAT |
Der Kommentar des Archives liegt in einem unbekannten Format vor. |
| ERAR_SMALL_BUF |
Der Speicherblock zur Aufnahme eines Kommentares war zu klein. |
Code
CodeCentral ID 15321
: Meine Header Translation und ein UnRAR Beispiel.
Die Original DLL: http://www.rarsoft.com/rar_add.htm