Seite 1 von 1

Dateien zu einer bereits bestehenden Pack-Datei hinzufügen

Verfasst: 03.01.2010 17:45
von Sunny
Mahlzeit @all,
ich würde gerne wissen, ob ich mit dem Befehl: "OpenPack()" nur Lese- oder auch Schreibzugriff auf die Pack-Datei habe, also meinen Versuchen nach zu urteilen, ist dem nicht so aber wie kann ich dann Dateien zu einer bereits vorhandenen Pack-Datei hinzufügen?

Re: Dateien zu einer bereits bestehenden Pack-Datei hinzufügen

Verfasst: 03.01.2010 17:49
von NathanielBlack
ALso ich habe mal in der Hilfe gesucht, obwohl ich noch nie davon etwas gehört habe und bin auf folgenden -hoffentlich nützlichen- Eintrag gestoßen:

AddPackMemory

oder:

AddPackFile


Du solltest beide ausprobieren. Wie gesagt, habe keinen Plan;)

mfg
Nathaniel

ps: die Hilfe ist nützlich und beinhaltet auch ein Kapitel über "Packs";)

Re: Dateien zu einer bereits bestehenden Pack-Datei hinzufügen

Verfasst: 03.01.2010 17:52
von ts-soft
OpenPack() ist wohl falsch gewählt, ReadPack() würde es eher treffen. Hinzufügen ohne komplette
Neuerstellung ist wohl nicht.

Am besten einen eigenes Containerformat entwickeln, wo Du mehr Möglichkeiten hast, sowie
mit Checksummen die Dateien prüfst, die Namen mit Angibst usw., oder gleich PureDataConvertor
nutzen :mrgreen:

Gruß
Thomas

Re: Dateien zu einer bereits bestehenden Pack-Datei hinzufügen

Verfasst: 03.01.2010 17:55
von Sunny
die namen der dateien sind mir eigentlich relativ egal... aber ok, dann werd ich mal sehen, was sich machen lässt, wenn nicht, dann melde ich mich nochmal

Re: Dateien zu einer bereits bestehenden Pack-Datei hinzufügen

Verfasst: 03.01.2010 19:51
von Christian+
Folgenden Code habe ich mal vor einiger Zeit geschrieben der kann mit Archiven umgehen die mit den PureBasic befehlen erstellt wurden und erstellt auch die eigenen in dem Format. Durch die Unterscheidung zwischen OpenPackX nur zum weiter rein packen und ReadPackX zum auslesen gibt es dabei keine solches Problem mehr wie du hast. Vielleicht hilft dir der Code ja irgendwie auch wenn ich dir raten würde einmal richtige Packfunktionen selbst zu schreiben dann kannst dir ein Dateiformat nach Wahl anlegen und alles drin speichern was du willst (Checksummen, Dateiname, usw.).

Code: Alles auswählen

Global packx_file.i
Global packx_size.l
Global *packx_memory

Procedure.i ReadPackX(FileName$)
  packx_file = ReadFile(#PB_Any, FileName$)
  ProcedureReturn packx_file
EndProcedure

Procedure.i OpenPackX(FileName$)
  packx_file = OpenFile(#PB_Any, FileName$)
  FileSeek(packx_file, Lof(packx_file))
  ProcedureReturn packx_file
EndProcedure

Procedure.i NextPackFileX()
  Protected *memory, size.l, error.l
  packx_size = ReadLong(packx_file)
  If packx_size = 0
    ProcedureReturn 0
  EndIf
  size = ReadLong(packx_file)
  *memory = AllocateMemory(size)
  ReadData(packx_file, *memory, size)
  If *packx_memory<>0
    FreeMemory(*packx_memory)
  EndIf
  *packx_memory = AllocateMemory(packx_size)
  packx_size = UnpackMemory(*memory, *packx_memory) 
  FreeMemory(*memory)
  ProcedureReturn *packx_memory
EndProcedure

Procedure.l PackFileSizeX()
  ProcedureReturn packx_size
EndProcedure

Procedure ClosePackX()
  If *packx_memory<>0
    FreeMemory(*packx_memory)
    *packx_memory = 0
  EndIf
  CloseFile(packx_file)
EndProcedure

Procedure.i CreatePackX(FileName$)
  packx_file = CreateFile(#PB_Any, FileName$)
  ProcedureReturn packx_file
EndProcedure

Procedure AddPackMemoryX(*MemoryAddress, Length, CompressionLevel=9)
  Protected *memory, size.l, error.l
  size = Length+8
  *memory = AllocateMemory(size)
  size = PackMemory(*MemoryAddress, *memory, Length, CompressionLevel)
  WriteLong(packx_file, Length)
  WriteLong(packx_file, size)
  WriteData(packx_file, *memory, size)
  FreeMemory(*memory)
EndProcedure

Procedure AddPackFileX(FileName$, CompressionLevel=9)
  Protected *memory, file.i, size.l
  file = ReadFile(#PB_Any, FileName$)
  size = Lof(file)
  *memory=AllocateMemory(size)
  ReadData(file, *memory, size)
  CloseFile(file)
  AddPackMemoryX(*memory, size, CompressionLevel)
  FreeMemory(*memory)
EndProcedure
Beispiel: (braucht zwei Bildern musst im Code halt den Namen von den Bildern an eigene anpassen dann kannst es Testen)

Code: Alles auswählen

CreatePack("test.pak")
  AddPackFile("bild1.bmp")
ClosePack()

OpenPackX("test.pak")
  AddPackFileX("bild2.bmp")
ClosePackX()

OpenPack("test.pak")
  CatchImage(1, NextPackFile())
  CatchImage(2, NextPackFile())
  SaveImage(1, "bild1new.bmp")
  SaveImage(2, "bild2new.bmp")
ClosePack()
mfg Christian+