PPack
Übersicht

![]() |
PddBetreff: PPack |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() Kritik und Bugs sind erwünscht ![]() 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. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group