Packer bei Komprimierten Dateien

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Code: Alles auswählen

File = ReadFile(#PB_Any, "Test.avi")

If File
  DestF = CreateFile(#PB_Any, "Test.pak")
  If DestF
    FMem = AllocateMemory(20971520); 20 MB
    DMem = AllocateMemory(20971520 + 8)
    If FMem And DMem
      If Lof(File) >= 20971520
        Repeat
          FSize = ReadData(File, FMem, FSize)
          DSize = PackMemory(FMem, DMem, FSize)
          WriteData(DestF, DMem, DSize)
        Until FSize <  20971520 ; 20 MB
      Else
        FSize = Lof(File)
      EndIf
      FSize = ReadData(File, FMem, FSize)
      DSize = PackMemory(FMem, DMem, FSize)
      WriteData(DestF, DMem, DSize)
    EndIf
  EndIf
  CloseFile(DestF)
  CloseFile(File)
  FreeMemory(FMem)
  FreeMemory(DMem)
EndIf
Ungetested, werden 20 MB happen geschrieben.
Zuletzt geändert von ts-soft am 05.01.2007 20:48, insgesamt 4-mal geändert.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
kiki
Beiträge: 155
Registriert: 06.05.2006 17:54

Beitrag von kiki »

Code: Alles auswählen

  ReadData(File, Mem, FSize) 
Mem gibts nicht, soll dass FMem heißen?

Und außerdem werden bei mir bei großen Dateien (300MB)
wieder Meory Fehlermeldungen angezeigt!!!
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>> Und außerdem werden bei mir bei großen Dateien (300MB)
Warum, er liest und schreibt maximal 20 MB, belegt also ca. 40 MB RAM
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
kiki
Beiträge: 155
Registriert: 06.05.2006 17:54

Beitrag von kiki »

Danke!!!!, aber..

...Die Datei kann aber auch mal größer sein als 20 oder 40 MB, dann muss ich ja immer die Datei-Größe eingeben.

Dass tool soll ca.50% ermitteln dann einen so großen arbeitsspeicher machen, dass dann packen und dann den rest erstellen und packen.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Du mußt garnichts angeben, die Routine funktioniert mit jeder Dateigröße,
bis 2 GB
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
kiki
Beiträge: 155
Registriert: 06.05.2006 17:54

Beitrag von kiki »

Aber ich muss die Größe des speichers größer angeben.
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Beitrag von a14xerus »

kiki hat geschrieben:Danke!!!!, aber..
...Die Datei kann aber auch mal größer sein als 20 oder 40 MB, dann muss ich ja immer die Datei-Größe eingeben.
nein, les dir den code doch nocheinmal durch, er macht in einer repeat je 20 mb laden und wieder schreiben (gepackt)
kiki hat geschrieben:Dass tool soll ca.50% ermitteln dann einen so großen arbeitsspeicher machen, dass dann packen und dann den rest erstellen und packen.
und was wäre dann mit 4 gb dateien ? (bsp)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

So, hier nochmal ne getestete Version :mrgreen:

Code: Alles auswählen

File = ReadFile(#PB_Any, "test.avi")
If File
  If CreatePack("test.pak")
    FMem = AllocateMemory(20480000); 20 MB
    If FMem
      FSize = 20480000
      While Not Loc(File) = Lof(File)
        If Lof(File) - Loc(File) < 20480000
          FSize = Lof(File) - Loc(File)
        EndIf
        ReadData(File, FMem, FSize)
        AddPackMemory(FMem, FSize)
      Wend
    EndIf
    ClosePack()
  EndIf
  CloseFile(File)
  FreeMemory(FMem)
EndIf
// Edit
So kann man es auch wieder entpacken :mrgreen:
Zuletzt geändert von ts-soft am 05.01.2007 21:49, insgesamt 1-mal geändert.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
kiki
Beiträge: 155
Registriert: 06.05.2006 17:54

Beitrag von kiki »

Ich habs probiert, der Prozess hat ein bisschen gedauert (und ich hab mich schon gefreut) aber die Datei ist immer noch 0 Byte groß!!!!!!!! /:->
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

kiki hat geschrieben:Ich habs probiert, der Prozess hat ein bisschen gedauert (und ich hab mich schon gefreut) aber die Datei ist immer noch 0 Byte groß!!!!!!!! /:->
Wenn die Datei schon irgendwie komprimiert ist, macht der Packer schon bei
12 MB zu, mußte oben einfach mal anpassen. Hab den Code im vorherigen
Posting editiert, jetzt ist es auch wieder entpackbar, obwohl das wurde ja
nicht gefordert :lol:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten