[B+, B2D, B3D] einfacher Dateipacker

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

EPS

Betreff: [B+, B2D, B3D] einfacher Dateipacker

BeitragMo, Nov 14, 2005 13:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi zusammen,

ich hab mal einen einfachen Dateipacker und Entpacker geschrieben. Sollte durch die Kommentare selbsterklärend sein.

Code: [AUSKLAPPEN]
;==============================================================================================================
;  Language: Blitz 2D, 3D, +
;
; Einfacher Dateipacker und Entpacker (keine Komprimierung, keine Verschlüsselung !!!).
;==============================================================================================================


Result = FP_PackageFile("test.jpg", "paket.pck"): Print Result

Result = FP_ExtractFile("test.jpg", "paket.pck", "kopie von test.jpg"): Print Result

WaitKey()
End

Function FP_PackageFile(InputFile$="", PackageFile$="")
;==============================================================================================================
; Fügt die Datei InputFile$ zu dem Paket PackageFile$ hinzu.
;
; Bei der Angabe von InputFile$ wird nur der Dateiname übernommen. Ein angegebener Dateipfad wird ignoriert.
;
; Ist die Datei PackageFile$ nicht vorhanden wird sie erzeugt. Ist PackageFile$ kein Paket oder tritt ein
; anderer Fehler auf, liefert die Funktion False zurück. Klappt alles wird True zurück gegeben.
;==============================================================================================================
   Local PackHandle, InpHandle, InpBank, InpSize, i

   ;--> Wurden Input und Package Datei übergeben und existiert Input Datei.
   If InputFile$="" Or PackageFile$="" Or FileType(InputFile$) <> 1 Then Return False
   
   ;--> existiert Package Datei? Wenn nicht lege sie an.
   If FileType(PackageFile$) <> 1 Then
      PackHandle = WriteFile(PackageFile$)
      ;--> Konnte Datei geöffnet werden?
      If PackHandle = 0 Then Return False
      ;--> schreibe Header
      WriteInt PackHandle,$2D535045
      WriteInt PackHandle,$6B636150
      CloseFile PackHandle
   End If
   
   ;--> Erzeuge Input Bank.
   InpSize = FileSize(InputFile$)
   InpBank = CreateBank(InpSize)
   
   ;--> Lies Input Datei ein.
   InpHandle = ReadFile(InputFile$)
   ReadBytes InpBank,InpHandle,0,InpSize
   CloseFile InpHandle
   
   ;--> Öffne Package Datei.
   PackHandle = OpenFile(PackageFile$)
   
   ;--> Konnte Datei geöffnet werden?
   If PackHandle = 0 Then Return False
   
   ;--> Prüfe Header.
   If ReadInt(PackHandle) <> $2D535045 Or ReadInt(PackHandle) <> $6B636150 Then
      CloseFile PackHandle
      Return False
   End If
   
   ;--> Setze Zeiger auf EOF.
   SeekFile PackHandle, FileSize(PackageFile$)
   
   ;--> Prüfe ob im Input Dateinamen ein Pfad enthalten ist. Wenn ja, extrahiere den Dateinamen.
   If Instr(InputFile$,"\") > 0 Then
      For i = Len(InputFile$) To 1 Step -1
         If Mid$(InputFile$,i,1) = "\" Then
            InputFile$ = Right$(InputFile$,Len(InputFile$)-i)
            Exit
         End If
      Next
   End If
   
   ;--> Schreibe Dateinamen und Länge des Namen der Input Datei.
   WriteInt PackHandle, Len(InputFile$)
   For i = 1 To Len(InputFile$)
      WriteByte PackHandle,Asc(Mid$(InputFile$,i,1))
   Next
   
   ;--> Schreibe Anzahl der Daten und den Bulk.
   WriteInt PackHandle, InpSize
   WriteBytes InpBank,PackHandle,0,InpSize
   
   ;--> schließe Datei.
   CloseFile PackHandle
   
   ;--> Bank freigeben.
   FreeBank InpBank
   
   ;--> okidoki
   Return True
End Function



Function FP_ExtractFile(ExtractFile$="", PackageFile$="", WriteToFile$="")
;==============================================================================================================
; Extrahiert die Datei ExtractFile$ aus dem Paket PackageFile$.
;
; Die Angabe von WriteToFile$ ist optional. Es dient dazu der Datei einen individuellen Namen zu geben. So
; können alle extrahierten Dateien eine spezifische Extension, zum Beispiel .TMP, bekommen. Auf diese Weise
; kann man später alle Dateien mit dieser Extension einfacher identifizieren und löschen.
;
; Existiert die Zieldatei schon, wird diese NICHT überschrieben.
;
; Wird die Datei erfolgreich extrahiert und geschrieben gibt die Funktion True zurück. Andernfalls False.
;==============================================================================================================
   Local PackHandle, WToBank, WToHandle, NLength, NName$, i
   
   ;--> Prüfe ob Paket existiert und alle Namen übergeben wurden.
   If FileType(PackageFile$) <> 1 Or PackageFile$ = "" Or ExtractFile$ = "" Then Return False
   
   ;--> Öffne Paket Datei.
   PackHandle = ReadFile(PackageFile$)
   
   ;--> Konnte Datei geöffnet werden?
   If PackHandle = 0 Then Return False
   
   ;--> Prüfe Header.
   If ReadInt(PackHandle) <> $2D535045 Or ReadInt(PackHandle) <> $6B636150 Then
      CloseFile PackHandle
      Return False
   End If
   
   ;--> Suche Extract Datei.
   While Not Eof(PackHandle)
      ;--> Lies Dateinamenlänge.
      NLength = ReadInt(PackHandle)
      ;--> Lies Dateinamen.
      NName$ = ""
      For i=1 To NLength
         NName$ = NName$ + Chr$(ReadByte(PackHandle))
      Next
      ;--> Der richtige Name?
      If Lower$(NName$) = Lower$(ExtractFile$) Then Exit
      ;--> Wenn nicht überspringe Bulk.
      NLength = ReadInt(PackHandle)
      SeekFile PackHandle, FilePos(PackHandle) + NLength
   Wend
   
   ;--> Wenn hier das Dateiende ist, wurde die Datei nicht gefunden.
   If Eof(PackHandle) Then Return False
   
   ;--> Andernfalls lies Länge des Bulk.
   NLength = ReadInt(PackHandle)
   
   ;--> Erzeuge Bank.
   WToBank = CreateBank(NLength)
   
   ;--> Lies Bulk.
   ReadBytes WToBank, PackHandle, 0, NLength
   
   ;--> schließe Datei.
   CloseFile PackHandle
   
   ;--> Neuer Dateiname?
   If WriteToFile$ = "" Then WriteToFile$ = NName$

   ;--> Existiert die Zieldatei schon?
   If FileType(WriteToFile$) = 1 Then Return False
   
   ;--> Öffne Ausgabedatei.
   WToHandle = WriteFile(WriteToFile$)
   
   ;--> Konnte Datei geöffnet werden?
   If WToHandle = 0 Then Return False
   
   ;--> schreibe Datei.
   WriteBytes WToBank, WToHandle, 0, NLength
   
   ;--> Schließe Datei.
   CloseFile WToHandle
   
   ;--> Bank freigeben.
   FreeBank WToBank
   
   ;--> okidoki
   Return True
End Function
mGUI - Graphical User Interface für Blitz3D...Informationen gibt es hier

Man kann sich öfter als zweimal im Leben halb tot lachen.

TheRealSephiroth

BeitragFr, Nov 18, 2005 14:16
Antworten mit Zitat
Benutzer-Profile anzeigen
danke war/is echt hilfreich
einziges manko: er braucht viel systemleistung

aber ansonsten danke

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group