PAK
von Christoph von Wittich
Übersicht
Inhaltsverzeichnis
Beschreibung
Archivformat von ID-Software zum speichern von Spieldaten. Es wird keine Komprimierung verwendet.
Allgemeiner Aufbau
Header | |
Header | String * 4 |
Index | Long |
Datenblock | |
Datenblock | Enthält die Daten der im Archiv gespeicherten Dateien |
Informationen zu den Daten | |
Entry | String * 56 |
FilePos | Long |
FileLen | Long |
Weitere Informationen
Header | PACK |
Index | Position des Datei-Info Blockes |
Entry | Pfad und Dateiname |
FilePos | Position der Datei im Archiv |
FileLen | Länge der Datei in Bytes |
Beispiel
Dim m_FileName As String Dim pkHeader As String * 4 Dim pkIndex As Long Dim pkCached As String Dim pkFileLen(0 To 5000) As Long Dim pkFilePos(0 To 5000) As Long Dim pkEntries(0 To 5000) As String * 56 Dim pkFileAnz As Long '--------------------------------- 'Lädt alle Infos in den Speicher '--------------------------------- Public Sub CachePAK(PAKFile As String) Dim i As Long pkFile = FreeFile Open PAKFile For Binary As pkFile Get pkFile, 1, pkHeader Get pkFile, , pkIndex Seek pkFile, pkIndex + 1 Do Until EOF(pkFile) Get pkFile, , pkEntries(i) Get pkFile, , pkFilePos(i) pkFilePos(i) = pkFilePos(i) + 1 Get pkFile, , pkFileLen(i) i = i + 1 Loop Close pkFile pkFileAnz = i - 1 pkCached = PAKFile End Sub '--------------------------------------- 'Gibt die Anzahl der Dateien im Archiv 'zurück '--------------------------------------- Public Function GetFileCount(PAKFile As String) If Not pkCached = PAKFile Then CachePAK PAKFile End If GetFileCount = pkFileAnz End Function '---------------------------------------- 'Gibt den Dateinamen der Datei "FileIndx" 'zurück '---------------------------------------- Public Function GetEntry(PAKFile As String, FileIndx As Long) As String If Not pkCached = PAKFile Then CachePAK PAKFile End If GetEntry = pkEntries(FileIndx) End Function '--------------------------------------- 'Extrahiert eine Datei aus dem Archiv '--------------------------------------- Public Function ExtractFile(PAKFile As String, FileIndx As Long, _ Optional DestFile As String) As Boolean Dim FileData As String pkFile = FreeFile Open PAKFile For Binary As pkFile DestFileNr = FreeFile FileData = Space(pkFileLen(FileIndx)) Get pkFile, pkFilePos(FileIndx), FileData If DestFile = "" Then DestFile = RTrim(pkEntries(FileIndx)) z% = InStrRev(DestFile, "/") DestFile = Right(DestFile, Len(DestFile) - z%) End If Open DestFile For Binary As DestFileNr Put DestFileNr, , FileData Close DestFileNr Close pkFile End Function