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..



Suche:
(unterstützt mySQL Wildcards ala %)
Titel:
Text:
Autor: