Archivformate - RAR

By: J.D. Hildebrand

Abstract: Dieser Artikel beschreibt die Dekomprimierung von Dateien aus einem RAR Archiv mit Hilfe der UnRAR.DLL von Eugene Roshal. Von Matthias Thoma.

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

Server Response from: SC4