Random Access PAK-Files erzeugen von ??? |
Folgender Code ist während der Arbeit am BSP2B3D "abgefallen". Er liest ein Verzeichnis ein und legt alle darin enthaltenen Dateien in eine einzelne Datei (nicht rekursiv). Wie man auf jede einzelne, enthaltene Datei zugreifen kann beschreibe ich nach dem Code. [code:1:6c4b7ebd32] Type tPak Field file$ Field fsize%,offset% End Type ; zu lesendes Verzeichnis ermitteln cmd$=CommandLine() If cmd$ Then ChangeDir cmd$ Else cmd$=CurrentDir() ; Verzeichnis einlesen dir=ReadDir(CurrentDir()) If dir filecount=0 Repeat file$=NextFile(dir) If file$<>" " And file$<>"." And file$<>".." If FileType(file$)=1 pak.tPak=New tPak pakfile$=file$ pakfsize=FileSize(file$) filecount=filecount+1 EndIf EndIf Until file$="" : CloseDir(dir) Else Print "Verzeichnis konnte nicht gelesen werden" EndIf ; Headersize ermitteln headsize=4 ; Anzahl der Dateien For pak.tPak=Each tPak : headsize=headsize+Len(pakfile$)+9 : Next Print "Größe des Headers: "+headsize+" bytes" ; Fileoffsets ermitteln current_offset=headsize For pak.tPak=Each tPak pakoffset=current_offset Print "Offset für "+pakfile$+" = "+current_offset current_offset=current_offset+pakfsize Next ; PAK schreiben pakfile=WriteFile("temp_pakfile.pak") If pakfile WriteInt pakfile,filecount For pak.tPak=Each tPak lang=Len(pakfile$) For i=1 To lang WriteByte pakfile,Asc(Mid(pakfile$,i,1)) Next WriteByte pakfile,0 WriteInt pakfile,pakfsize WriteInt pakfile,pakoffset Next ; Files übertragen For pak.tPak=Each tPak tmpfile=ReadFile(pakfile$) While Not Eof(tmpfile) byte=ReadByte(tmpfile) : WriteByte pakfile,byte Wend : CloseFile tmpfile Next : CloseFile pakfile Else Print "Fehler beim schreiben des PAK-Files" EndIf Print "" : Print "Fertig, drücke eine Taste um das Programm zu beenden" WaitKey : End [/code:1:6c4b7ebd32] [list:6c4b7ebd32]Im PAK-File stehen jetzt die Daten in folgender Reihenfolge: [*:6c4b7ebd32] Anzahl der Dateien im PAK [*:6c4b7ebd32] Dateiname (byteweise) bis zu einem Null-Byte. Ihr lest also solange ein Byte ein und addiert dieses auf einen String bis ein Null-Byte kommt [*:6c4b7ebd32] Dateigröße [*:6c4b7ebd32] Offset der Datei im PAK-File. Springt also einfach mit FileSeek auf diesen Offset und ladet in einer Schleife soviele Bytes wie in "Dateigröße" stand. Speichert diese Bytes unter dem vorher gelesenen Dateinamen ab und Ihr habt die gepackte Datei wieder :) [/list:u:6c4b7ebd32] [b:6c4b7ebd32][EDIT][/b:6c4b7ebd32] So, habe den Bug gefixt ... lest Euch nochmal die Beschreibung des Formats durch, da sich alles um 4 Bytes verschoben hat [b:6c4b7ebd32][/EDIT][/b:6c4b7ebd32] |
von ??? |
sehr schön.. Wär natürlich noch ideal wenn das ganze gepackt ist/wird und mit angemessener Geschwindigkeit während der Laufzeot entpackt und verwendet werden kann.. :D |
von ??? |
BUGALARM!! Es fehlt die Anzahl der Dateien im PAK ... ich fixe das und poste den verbesserten Code. ....und ja, ich editiere dafür das erste Post ;) @Triton: Gepackt wird da nix, aber man kann zur Laufzeit einzelne Dateien auslesen. [b:85d3db92af][EDIT][/b:85d3db92af] So, Gefahr erkannt, Gefahr gebannt ... jetzt kann man direkt auf einzelne Files im PAK zugreifen ohne alles aufeinmal entpacken zu müssen. @Triton: Wozu soll das packen gut sein? Bei heutigen Festplatten um die 80GB ist das nun wirklich nicht mehr notwendig ;) [b:85d3db92af][/EDIT][/b:85d3db92af] |
von ??? |
[quote:e96d2093e0]@Triton: Gepackt wird da nix, aber man kann zur Laufzeit einzelne Dateien auslesen. [/quote:e96d2093e0] eben, deshalb [u:e96d2093e0]wäre[/u:e96d2093e0] es ja auch gut.. :roll: Aber so wie ich das sehe, ist es nicht so das Probelm das zu realisieren.. |