Die Community zu .NET und Classic VB.
Menü

PAK

 von 

Übersicht 

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