Unkomprimiertes Dateiarchiv

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

 

CO2

ehemals "SirMO"

Betreff: Unkomprimiertes Dateiarchiv

BeitragMi, Nov 12, 2014 18:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
hier mal ein kleiner Include, mit dem es möglich ist, unkomprimierte Dateiarchive mit BlitzMax zu erstellen und auszulesen: BlitzMax: [AUSKLAPPEN]
Rem
Autor: Marius Otto
Datum: 23.05.2013
Referenz:
- Function SavePacFile:Int(Path:String, Files:TList)
-> Beschr.: Kreiert ein Datenpaket, mit allen Dateien, dessen Pfade in Files stehen, enthält.
-> Params: Path - String, Dateipfad
Files - TList, Alle Dateien, welche in das Paket eingebunden werden sollen als String in diese Liste speichern
-> Return: 1 = Fehlerfrei, 0 = Fehler
- Function LoadFileFromPac:TBank(PAC:TStream, FileName:String)
-> Beschr.: Extrahiert eine Datei aus dem Dateipaket
-> Params: PAC - TStream, DateiHANDLE des Datenpaketes
FileName - String, Dateiname der zu extrahierenden Datei
-> Return: NULL = Datei konnte nicht extrahiert werden, [TBANK] = Daten geladen
End Rem


Private
Global SAVEFUNCVERSION:String = "1.1"
Global READFUNCVERSION:String = "1.1"

Public
Function SavePacFile:Int(Path:String, Files:TList) ' Return: 0 = Misserfolg, 1 = Erfolg
Local PAC:TStream = WriteFile(Path)
If(PAC <> Null)
If(Files = Null)
Return 0
EndIf
WriteLine(PAC, "%PAC" + Replace(SAVEFUNCVERSION, ".", "") + "%") ' Version eintragen
WriteLine(PAC, "[REG]")
For Local x:String = EachIn Files
WriteLine(PAC, StripDir(x))
WriteInt(PAC, FileSize(x))
Next

WriteLine(PAC, "[DAT]")
Local TempSrcFile:TStream
For x = EachIn Files
TempSrcFile = ReadFile(x)
If(TempSrcFile = Null)
CloseFile(PAC)
DeleteFile(Path)
Return 0
EndIf
Repeat
WriteByte(PAC, ReadByte(TempSrcFile))
Until Eof(TempSrcFile)
CloseFile(TempSrcFile)
Next

CloseFile(PAC)
Return 1
Else
Return 0
EndIf
End Function

Function LoadFileFromPac:TBank(PAC:TStream, FileName:String)
If(PAC <> Null)
SeekStream(PAC, 0)
If(ReadLine(PAC) <> "%PAC" + Replace(READFUNCVERSION, ".", "") + "%") ' Versions-Check
Print("PACERR: Wrong PAC-Version found!")
Return Null
EndIf
If(ReadLine(PAC) <> "[REG]") ' Struktur-Check
Print("PACERR: Wrong Datastructure found!")
Return Null
EndIf

Local ErrCode:Int = 0 ' 0 = kein Fehler, 1 = EOF, 2 = Ende des Dateiregisters
Local SeekSize:Int = 0 ' Speichert die zu gehenden Bytes

Local SearchFileName:String = ""
Local SearchFileSize:Int = 0

Repeat
SearchFileName = ReadLine(PAC)
SearchFileSize = ReadInt(PAC)

SeekSize = SeekSize + SearchFileSize ' Positionen immer aufaddieren
If(Eof(PAC))
ErrCode = 1
Exit
EndIf
If(SearchFileName = "[DAT]")
ErrCode = 2
Exit
EndIf
Until SearchFileName = FileName
SeekSize = SeekSize - SearchFileSize ' Zum schluss einmal die Größe der gesuchten Datei wieder abziehen

If(ErrCode = 0) ' Nur wenn kein Fehler...
Local TempString:String = "" ' Zunächst bis zum Datenteil springen
Repeat
TempString = ReadLine(PAC)
If(TempString = "[DAT]")
Exit
EndIf
ReadInt(PAC)
Until Eof(PAC)
If(Eof(PAC))
Return Null
EndIf

SeekStream(PAC, (StreamPos(PAC) + SeekSize)) ' Von da an bis zum Dateianfang der gesuchten Datei springen.

Local ReturnMe:TBank = CreateBank(SearchFileSize)

ReadBank(ReturnMe, PAC, 0, SearchFileSize)

Return ReturnMe
Else
Print("PACERR: Unexpected End-of-File")
Return Null
EndIf
Else
Return Null
EndIf
End Function

Function ListPacContent:Int(Path:String)
Local PAC:TStream = ReadFile(Path)
If(PAC <> Null)
SeekStream(PAC, 0)
If(ReadLine(PAC) <> "%PAC" + Replace(READFUNCVERSION, ".", "") + "%") ' Versions-Check
Print("PACERR: Wrong PAC-Version found!")
Return Null
EndIf
If(ReadLine(PAC) <> "[REG]") ' Struktur-Check
Print("PACERR: Wrong Datastructure found!")
Return Null
EndIf

Local ListFileName:String = ""
Local ListFileSize:Int = 0
Local FileCounter:Int = 1

Print("Data-Package '" + Path + "' contains:")
Print("No.~tName~t~t~t~t~tSize in Bytes")
Repeat
ListFileName = ReadLine(PAC)
ListFileSize = ReadInt(PAC)
If(ListFileName <> "[DAT]")
Print(" " + FileCounter + "~t" + ListFileName + "~t~t~t~t" + ListFileSize + "")
EndIf
FileCounter = FileCounter + 1
Until ListFileName = "[DAT]" Or Eof(PAC)

CloseFile(PAC)
Print("" + (FileCounter - 2) + " Files")
Else
Print("PACERR: Package not found!")
Return 0
EndIf
End Function


Wie funktionierts?
Arrow Wenn man ein Datenpaket erstellen will, ruft man einfach die Funktion SavePacFile() mit den beiden Parametern auf:
1.) Path:String - resultierende Dateipfad zum Dateiarchiv
2.) Files:TList - Eine Liste von Strings mit allen Dateien, die in das Paket sollen, also in etwa so angelegt (Pseudocode) BlitzMax: [AUSKLAPPEN]
Global FileList:TList = CreateList()
ListAddLast(FileList, "Bild.bmp")
ListAddLast(FileList, "Text.txt")
ListAddLast(FileList, "NochEinBild.jpg")
' usw...


Arrow Wenn man eine Datei aus einem Datenpaket "extrahieren" möchte, ruft man die Funktion LoadFileFromPac:TBank() mit den beiden Parametern auf:
1.) PAC:TStream - Das als TStream geöffnete Datenpaket (Nicht der Pfad dahin)
2.) FileName:String - Der Name der zu extrahierenden Datei (Nur der tatsächliche Dateiname, nicht der grundsätzliche Pfad (Beispiel: Statt "C:\Test\WichtigeDatei.txt" muss "WichtigeDatei.txt" angegeben werden)
3.) Die Funktion returned eine TBank, diese kann dann weiterverwendet werden.

Ich hoffe es hilft dem einen oder anderen...
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group