PPack

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Pdd

Betreff: PPack

BeitragMo, Nov 27, 2006 18:06
Antworten mit Zitat
Benutzer-Profile anzeigen
So, hier mal etwas, was der ein oder andere vllt brauchen könnte:
PPack. Mit dieser Lib kann man Pakete erstellen, Dateien/Verzeichnisse hinzufügen, das Paket abspeichern. Dann sind alle Dateien im Paket enthalten (welches eine Datei ist.) Dies kann man z.b. benützen, um Seine Dateien gegen ResourcenKlau zu sichern. Denn so werden sie erst während der Laufzeit entpackt. Ausserdem gibt es nurnoch 2 Dateien (deine Exe + die *.pak (Endung wählbar)) Dann können Pakete geöffnet werden, eine oder Alle Dateien entpackt werden.
Ich habe versucht, es so gut wie möglich zu dokumentieren Wink IHr solltet also damit zurechtkommen. Hinzu kommt noch, das dies erst V0.3 ist, d.h. es sind noch nicht alle Funktionen dabei. Z.b. Kommen noch FUnktionen dazu, um ein Bild/SOund/Model DIREKT aus einem Paket zu laden, ohne zwischenspeicherung auf der HDD.

Kritik und Bugs sind erwünscht Wink

Wenn ihr das benutzt, würd ich mich über einen Credits-Eintrag freuen, da es mich dann doch schon mehrere Abende gekostet hat, diese Lib zu erstellen.

So hier ist erstmal ein Beispiel, das (FAST) alle Funktionen der Lib verwendet:


Code: [AUSKLAPPEN]
Include "PPack.bb"

;Diese Demo zeigt fast alle Funktionen der PPack Lib. Bei Fragen könnt ihr mich auch einfach anschreiben.

Print "Bitte auswählen:"
Print "(1) Neues Paket"
Print "(2) Paket Entpacken"

FlushKeys
WaitKey

If KeyHit(2) Then
   ; Neues Paket erstellen
   Print "Neues Paket erstellen."
   p = PP_NeuesPaket(Input("Paketname: "))
   Print "Paket '" +  PP_PaketName$(p) + "' wurde erstellt. Es hat die ID " + PP_PaketID(p)
   If PP_VerzeichnisHinzu(p, Input("Verzeichnis(leer für aktuelles):"), 0) = False Then
      Print "Dateien hinzufügen fehlgeschlagen!"
      Delay 1000
      End
   Else
      Print "Dateien hinzugefügt."
   EndIf
   Print "Dateien auflisten:"
   PP_DateienAuflisten(p, 1)
   Print "ENTER, um Paket zu erstellen."
   FlushKeys
   WaitKey
   If KeyHit(28) Then
      Print "Erstelle Paket"
      If PP_PaketErstellen(p, 1, "", "pak") = True Then
         Print "Paket erstellt. " + Str(PP_PaketGroesse(p)) + "B"
      Else
         Print "Paket erstellen Fehlgeschlagen!"
      EndIf
   Else
      End
   EndIf
EndIf

If KeyHit(3) Then
   ;; Paket Entpacken/laden
   p = PP_PaketAufmachen("Name", Input("Paket: "), 0)
   If p <> 0 Then
      Print "Größe des Pakets: " + Str(PP_PaketGroesse(p)) + "B"
      Print "Dateien im Paket:"
      PP_DateienAuflisten(p, 1)
      Print ""
      If PP_DateiEntpacken(p, Input("Datei entpacken: "), Input("zu entpacken: ")) = True Then
         Print "Datei entpackt!"
         
      Else
         Print "Datei konnte nicht entpackt werden!"
      EndIf
      Print "Alles Entpacken..."
      PP_AllesEntpacken(p)
      Print "Fertig."
   Else
      Print "Paket konnte nicht geöffnet werden!"
   EndIf
EndIf

WaitKey
End


Und hier die Lib selbst:
Code: [AUSKLAPPEN]

; PPack v0.3 by Pdd (C) 2006.
; Mail: pddpms [ÄT] yahoo.de
; Diese Lib darf frei verwendet werden, würde mich aber um einen Credits-Eintrag freuen!

;; Wichtig: Wenn ein Paket geöffnet wird, kann man es nicht wieder abspeichern, dazu muss man die Dateien entpacken
;; und ein neues Paket erstellen!

Type TPack
   Field name$
   Field Size
   Field ID
   Field path$ = ""
End Type

Type TFile
   Field path$
   Field size
   Field ID
   Field ParentID
   Field name$
End Type

Global Pack.TPack, File.TFile

;; Erstellt ein Neues Paket
;; name - Name des Paketes
;; Rückgabe: Gibt die identität des Pakets zurück.

Function PP_NeuesPaket(name$)
   Pack = New TPack
   Pack\name$ = name$
   Pack\id = Handle(Pack)
   Pack\path = ""
   Return Handle(Pack)
End Function

;; Fügt eine Datei zu einem Paket hinzu.
;; Paket     - ein erstelltes Paket
;; path$     - Der DateiPfad

Function PP_DateiHinzu$(Paket, path$)
   Pack = Object.TPack(Paket)
   File = New TFile
   File\path$ = path$
   File\size = FileSize(path$)
   File\id = Handle(File)
   File\ParentID = Pack\id
   Pack\Size = Pack\Size + File\size
   s$ = path$
   pos = 0
   For i = Len(s$) To 1 Step -1
      pos = Instr(s$, "\", i)
      DebugLog(pos)
      If pos <> 0 Then Exit
   Next
   s$ = Mid(s$, pos + 1, 255)
   File\name = s$
      
End Function

;; Fügt alle Dateien eines Verzeichnisses zu einem Paket hinzu.
;; Paket   - ein erstelltes Paket
;; path$   - Der Verzeichnisspfad (mit abschliesendem "\"!!!)
;; glob (1)- Global(1) oder Local(0). Standart auf Global. Dh. es muss ein Gesamter Pfad angegeben werden. Optional kann Local
;;          verwendet werden, dann kann man in die Unterverzeichnisse der exe wechslen (ohne "\" am anfang, mit "\" am ende.)
;;
;;   Rückgabe: Liefert True bei erfolg. False bei Fehlschlag.

Function PP_VerzeichnisHinzu(Paket, path$, glob = 1)
   Pack = Object.TPack(Paket)
   s$  = ""
   alt$ = CurrentDir()
   If glob = 0 Then s$ = CurrentDir()
   s$ = s$ + path$
   ChangeDir(s$)
   vz = ReadDir(s$)
   ;DebugLog(s$)
   If vz <> 0 Then
      Repeat
         Datei$ = NextFile(vz)
         If FileType(Datei$) = 1 Then
            File = New TFile
            File\id = Handle(File)
            File\ParentID = Pack\id
            File\path = CurrentDir() + Datei$
            File\size = FileSize(CurrentDir() + Datei$)
            Pack\Size = Pack\Size + File\size
            File\name = Datei$
            ;DebugLog("hinzugefügt: " + CurrentDir() + Datei$)
         EndIf
      Until Datei$ = ""
      CloseDir(vz)
      ChangeDir(alt$)
      Return True
   Else
      Return False
   EndIf
End Function

;; Listet alle Enthaltenen Dateien eines Paketes auf
;; Paket  - Ein erstelltes Paket
;; MitGroesse(1) - Soll die Größe der Datei mit angegeben sein?

Function PP_DateienAuflisten(Paket, MitGroesse = 1)
   For File = Each TFile
      If File\ParentID = Paket Then
         s$ = File\name

         If MitGroesse = 1 Then
            Print s$  + "  " + File\size
         Else
            Print s$
         EndIf
         
      EndIf
   Next
End Function

;; Liefert die ID eines Paketes zurück. Diesen Befehl braucht man eigentlich nicht, weil man mit der ID nichts anfangen kann xD
;; Paket - Ein erstelltes Paket

Function PP_PaketID(Paket)
   Pack = Object.TPack(Paket)
   Return Pack\id
End Function

;; Liefert den Namen eines Paketes zurück.
;; Paket - Ein erstelltes Paket

Function PP_PaketName$(Paket)
   Pack = Object.TPack(Paket)
   Return Pack\name$
End Function

;; Liefert den Dateiname einer Datei aus einem Paket mithilfe der ID
;; Paket - Ein erstelltes Paket
;; FileID - Die ID der Datei

Function PP_DateiName$(Paket, FileID)
   For File = Each TFile
      If File\ID = FileID And File\ParentID = Paket Then
         Return File\name
      EndIf
   Next
End Function

;; Liefert die ID einer Datei aus einem Paket anhand des Namens.
;; Paket - Ein erstelltes Paket
;; Name$ - Name der Datei (Mit Endung)

Function PP_DateiID(Paket, name$)
   For File = Each TFile
      If File\name = name$ And File\ParentID = Paket Then
         Return File\ID
      EndIf
   Next
End Function

;; Gibt die Größe eines Paketes in B zurück.
;; Paket - ein Paket

Function PP_PaketGroesse(Paket)
   Pack = Object.TPack(Paket)
   Return (Pack\Size)
End Function

;; Erstellt ein Paket aus den Hinzugefügten Dateien. Dies geht nur mit einem Neuen Paket. Ein Paket, das geladen wurde, kann
;; nicht wieder gepackt werden.
;; Paket - Ein NEU erstelltes Paket
;; NameAlsDateiName(1) = Ob der Name des Paketes als Dateiname verwendet werden soll
;; FileName$ - Wird nur benötig, wenn vorheriger Parameter 0 ist. Dann ist dies der Dateiname (ohne Endung)
;; Endung $ - Dies ist IN JEDEM FALL die Endung der Datei (ohne ".")
;; Rückgabe: Ture bei erfolg, False bei Fehlschalg

Function PP_PaketErstellen(Paket, NameAlsDateiName = 1, FileName$, Endung$)
   Pack = Object.TPack(Paket)
   
   For File = Each TFile
      If File\ParentID = Pack\ID Then
         If File\path = "" Then Return False
      EndIf
   Next
   
   s$ = CurrentDir()
   
   If NameAlsDateiName <> 1 Then
      s$ = s$ + FileName$ + "." + Endung$
   Else
      s$ = s$ + Pack\name + "." + Endung$
   EndIf
   
   Datei = WriteFile(s$)
   Pack\path = s$
   If Datei <> 0 Then
      For File = Each TFile
         If File\ParentID = Paket And File\path <> 0 Then
            WriteLine(Datei, File\name)
            WriteInt(Datei, File\size)
            File_stream = ReadFile(File\path)
               For i = 0 To File\size
                  WriteByte(Datei, ReadByte(File_stream))
               Next         
         EndIf
      Next
      
      CloseFile(Datei)
      Return True
   Else
      Return False
   EndIf
End Function

;; Löscht ein Paket und seine Dateien aus dem Speicher (nicht die abgespeicherte Datei auf der Festplatte)
;; Paket - Ein Paket

Function PP_PaketAusSpeicher(Paket)
   Pack = Object.TPack(Paket)
   For File = Each TFile
      If File\ParentID = Pack\ID Then
         Delete File
      EndIf
   Next
   Delete Pack
End Function

;; Löscht alle Dateien und Pakete aus dem Speicher. (nicht von der Festplatte!)

Function PP_AllesAusSpeicher()
   For Pack = Each TPack
      Delete Pack
   Next
   For File = Each TFile
      Delete File
   Next
End Function

;; Öffnet ein Paket, um daraus Dateien zu entpacken
;; name$  - Name des neuen Paketes
;; PaketPfad$ - Pfad zum Paket mit dateiname + Endung.
;; Glob(0) - Pfad Global(1, d.h. völlständiger Pfad) oder Lokal(0, relativer Pfad)

Function PP_PaketAufmachen(name$, PaketPfad$, Glob = 0)
   If Glob = 0 Then
      s$ = CurrentDir() + PaketPfad$
      Datei = ReadFile(s$)
   Else
      s$ = PaketPfad$
      Datei = ReadFile(s$)
   EndIf
   ;DebugLog(Datei)
   If Datei <> 0 Then
      Pack = New TPack
      Pack\ID = Handle(Pack)
      Pack\name = name$
      Pack\Size = 0
      Pack\path = s$
      Repeat
         File = New TFile
         File\ID = Handle(File)
         File\ParentID = Pack\ID
         File\path = ""
         File\name = ReadLine$(Datei)
         File\size = ReadInt(Datei)
         Pack\Size = Pack\Size + File\size
         SeekFile Datei, File\Size + FilePos(Datei) + 1
      Until Eof(Datei)
      CloseFile(Datei)
      Return Handle(Pack)
   Else
      Return False
   EndIf
End Function

;; Entpackt eine Datei aus einem geöffneten paket.
;; Paket - ein geöffnetes Paket
;; DateiName$ = Der DateiName (mit Endung)
;; Pfad - (Relativer) Pfad zum Entpacken der Datei

Function PP_DateiEntpacken(Paket, DateiName$, Pfad$)
   Pack = Object.TPack(Paket)
   PaketDatei = ReadFile(Pack\path)
      Repeat
         name$ = ReadLine$(PaketDatei)
         size = ReadInt(PaketDatei)
         If name$ = DateiName$ Then
            Datei = WriteFile(CurrentDir() + Pfad$)
            For i = 0 To size
               WriteByte(Datei, ReadByte(PaketDatei))
            Next
            Return True
         EndIf
         SeekFile PaketDatei, size + FilePos(PaketDatei) + 1
      Until Eof(PaketDatei)   
End Function

;; ENtpackt alle Dateien aus einem geöffnetem Paket.
;; Paket - Ein geöffnetes Paket

Function PP_AllesEntpacken(Paket)
   Pack = Object.TPack(Paket)
   PaketDatei = ReadFile(Pack\path)
   Repeat
      name$ = ReadLine$(PaketDatei)
      size = ReadInt(PaketDatei)
      Datei = WriteFile(CurrentDir() + name$)
      For i = 0 To size
         WriteByte(Datei, ReadByte(PaketDatei))
      Next
   Until Eof(PaketDatei)   
End Function
Lieber Apfel als Birne.

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group