Entwickler-Ecke
Dateizugriff - ZIP datei im ram, aber wie ?
mimi - Do 05.06.03 20:11
Titel: ZIP datei im ram, aber wie ?
Hallo,
ich möchte eine selbstersellte zip datei "nur" in den ram laden. im zip befindet sich eine textdatei(für ein spiel, was ich erstellt habe). wie bekomme ich die Entpacke zip datei in den ram ?
es soll nichts auf der platte geschrieben werden. die datei ist 1,15 KB groß und gepackt ca 300 byte.
[mod="Tino]Absätze entfernt.[/mod]
tommie-lie - Do 05.06.03 20:32
Welche Bibliothek denn?
bei der zLib müsste es sowas wie "DeCompressBuf" oder "DeCompressBuffer" geben, das in einen String, bzw eine beliebige Variable entpackt. Evtl geht es auch mit MemoryStreams statt mit Filestreams, aber da müsste ich nachgucken und ausprobieren.
mimi - Do 05.06.03 20:34
ich dachte es gebe eine einfache komponente dafür, wo man einfach nur die zip angiebt und der rest passiert von alleine.
tommie-lie - Do 05.06.03 20:37
Was benutzt du denn zur Zeit? Nicht die zLib?
Komponenten wird es wahrscheinlich auch geben, aber ich kenne keine. aber die zLib ist auch nicht wirklich schwer zu verstehen.
mimi - Do 05.06.03 20:52
könntes du ein beispiel geben ?
wie man sowas mit zLib macht.
zLib soll doch bos zu 75% die datei packen ist das mehr als zip oder ist das weniger bzw. wie stack packt denn zip die datei ?
Tweafis - Do 05.06.03 21:14
Kommt drauf an, was du zippst, ich hab nen zipordner und darin ist ne datei mit 100% komprimierung :mrgreen: von 107Mb auf 104KB :mrgreen:
(Ist ne Textdatei mit lauter 1en)
mimi - Do 05.06.03 22:18
lol, ich habe reinen text(wie gesagt eine reine Text datei, die für das spiel "lebenswichtig" ist) könnte mir jemmand ein beispiel geben wie ich mit diem zLib umgehen ? gibt es komponenten für diese packer lib ???
Moderiert von
Tino: Absätze entfernt.
Tweafis - Do 05.06.03 22:53
| mimi hat folgendes geschrieben: |
| lol, ich habe reinen text |
Naja, kommt auch drauf an wie der Text aufgebaut ist. Wie gesagt, mein Text besteht nur aus 1en also ungefähr so:
11111111111111111111111111111111111111
11111111111111111111111111111111111111
11111111111111111111111111111111111111
11111111111111111111111111111111111111
11111111111111111111111111111111111111
11111111111111111111111111111111111111
11111111111111111111111111111111111111
Nur halt ohne zeilenumbruch
das kann der dann komprimieren indem er die anzahl der einsen und die eins speicehrt.
mimi - Fr 06.06.03 14:12
mit beispiel meinte ich ein beispiel qullcode wie man es in delphi machen müsste um das ziel zu erereichen:)
O'rallY - So 08.06.03 10:29
Wenn du dir mal die ZLib Unit anguckst, findest du TCompressionStream und TDecompressionStream (Jedenfalls ab Delphi V. 6). Alles was du in diese Streams reinschreibst wird automatisch komprimiert bzw. dekomprimiert. Diese Streams kannst du wie nen MemoryStream handhaben, also das ganze findet nur im virtuellen Speicher statt.
mimi - So 08.06.03 15:09
hatte ich schon angeschaut aber leider knnte ich damit nicht viel anfagen. könntes du mir bitte ein beispiel geben wie man damit packen könnte ?
O'rallY - So 08.06.03 18:06
Das Komprimieren klappt wunderbar, nur irgendwas läuft beim Dekomprimieren schief... :roll: (dieser Code legt keine Wert auf saubere Programmierung :wink: )
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| procedure TForm1.Button1Click(Sender: TObject); var Source, Dest: TMemoryStream; begin Source := TMemoryStream.Create; Source.LoadFromFile('e:\temp\temp.txt'); Dest := TMemoryStream.Create; with TCompressionStream.Create(clDefault, Dest) do try CopyFrom(Source, Source.Size); finally Free; end; Dest.SaveToFile('E:\temp\dest.txt'); Dest.Free; Source.Free; end;
procedure TForm1.Button2Click(Sender: TObject); var DecompressionStream: TDecompressionStream; Source, Dest: TMemoryStream; begin Source := TMemoryStream.Create; Source.LoadFromFile('E:\temp\dest.txt'); Dest := TMemoryStream.Create; DecompressionStream := TDecompressionStream.Create(Source); Dest.LoadFromStream(DecompressionStream); DecompressionStream.Free; Dest.SaveToFile('E:\temp\entpackt.txt'); Dest.Free; Source.Free; end; |
mimi - So 08.06.03 18:09
der sagt mir nicht viel ich sehe nur das er die daten nicht in einem TString klasse ablegt. ich hätte jetzt noch einen wunsch: könntes du den code so umschreiben das er die daten in einer TStringklasse ablegt ?
also die daten einer zip sollen in einer Tstringliste rein. kann ich jetzt einfach das zip format nehmen oder muss ich das in ein anders format packen ?? kennst du tutors die zLib erklären ?
Moderiert von
Tino: Absätze entfernt.
O'rallY - So 08.06.03 18:19
Funktioniert bei dir denn die Dekomprimierung, wenn du den Code ausführst (natürlich mit angeglichenen Dateipfaden).
TStrings -> TStringList hat eine Option LoadFromStream. Das dürfte alle deine Wünsche erfüllen.
mimi - So 08.06.03 18:35
das heißt also ich brauche nur die tsringlist mit loadstram aufrufen und als stream desk übegeben ? danke für deine hilfe den code werde ich später ausprobieren.
kann ich jetzt einfach ne zip datei laden ? oder wie geht das ?
Moderiert von
Tino: Absätze entfernt.
O'rallY - So 08.06.03 21:05
Ja, eigentlich müsstest du einfach eine ZIP-Datei laden können. Nur wie schon gesagt, Button2Click hat bei mir einen Stream irgendwas error hervorgerufen.
Ja, du kannst z.B. bei einem Memo einfach schreiben:
Delphi-Quelltext
1:
| Memo1.LoadFromStream(Dest); |
mimi - So 08.06.03 21:28
bei mir kommt auch eine felermeldung beim entpacken. ich hatte mal eine text datei erstellt mit den worten: das ist nur ein test von heute. zip hatte darauß eine datei gemacht die über 100 Byte groß war und zlib unter 70-80 byte:)
Moderiert von
Tino: Absätze entfernt.
mimi - So 08.06.03 21:34
habe den fehler gefunden:
Delphi-Quelltext
1:
| DecompressionStream := TDecompressionStream.Create(Source); |
wenn ich diese zeile rauß nehme geht es.
aber warum ist die falsch ???
mimi - So 08.06.03 22:08
| mimi hat folgendes geschrieben: |
habe den fehler gefunden:
Delphi-Quelltext 1:
| DecompressionStream := TDecompressionStream.Create(Source); |
wenn ich diese zeile rauß nehme geht es.
aber warum ist die falsch ??? |
edit:
wenn ich Memo1.Lines.LoadFromStream(Dest); mache macht er keiner änderungen im Memo warum nicht ?
ich habe mir jetzt folgen code gesucht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure ExpandStream(inStream, outStream :TStream); const BufferSize = 4096; var Count: Integer; ZStream: TDecompressionStream; Buffer: array[0..BufferSize-1] of Byte; begin ZStream := TDecompressionStream.Create(InStream); try while True do begin Count := ZStream.Read(Buffer, BufferSize); if Count <> 0 then OutStream.WriteBuffer(Buffer, Count) else Break; end; finally ZStream.Free; end; end; |
O'rallY - Mo 09.06.03 10:17
Das Memo wird aus irgendeinem Grund nicht geupdated. Probier mal die Methode
Refresh oder
Update (oder sowas in der Richtung, weiß grad nicht den richtigen Namen).
| mimi hat folgendes geschrieben: |
habe den fehler gefunden:
Sourcecode:
DecompressionStream := TDecompressionStream.Create(Source);
wenn ich diese zeile rauß nehme geht es.
aber warum ist die falsch ???
|
Wenn du diese Zeile Rausnimmst, kann es eigentlich gar nicht funktionieren, weil der DecompressionStream dann keinen Inhalt hat.
Aber der von dir gefundene Code scheint die Lösung zu sein, wobei ich immer noch nicht verstehe, was bei meinem Code falsch war :-|
mimi - Mo 09.06.03 15:33
hatte mich auch versehen es war die zeile danach:)
O'rallY - Mo 09.06.03 16:22
Wenn du die Zeile danach rausnimmst, kommt zwar kein Fehler, aber dummerweise ist dann auch nix im Dest-Stream drin, was man in ein Memo auslesen könnte.
mimi - Mo 09.06.03 17:00
aber wir wissen jetzt wo der fehler liegt in deiner funktion:)
und viliecht kann ihn ja jemmand behben:)
tommie-lie - Mo 09.06.03 18:19
Ungetestet, aber sollte klappen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TForm1.Button2Click(Sender: TObject); var DecompressionStream: TDecompressionStream; Source, Dest: TMemoryStream; begin Source := TMemoryStream.Create; Source.LoadFromFile('E:\temp\dest.txt'); Dest := TMemoryStream.Create; with TDecompressionStream.Create(Source) do try CopyFrom(DecompressionStream); finally Free; Dest.SaveToFile('E:\temp\entpackt.txt'); Dest.Free; Source.Free; end; |
In der anderen Prozedur hat es doch auch geklappt ;-)
mimi - Mo 09.06.03 19:00
falschen beitrag erwischt:)
O'rallY - Di 10.06.03 13:24
| tommie-lie hat folgendes geschrieben: |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TForm1.Button2Click(Sender: TObject); var DecompressionStream: TDecompressionStream; Source, Dest: TMemoryStream; begin Source := TMemoryStream.Create; Source.LoadFromFile('E:\temp\dest.txt'); Dest := TMemoryStream.Create; with TDecompressionStream.Create(Source) do try CopyFrom(DecompressionStream); finally Free; Dest.SaveToFile('E:\temp\entpackt.txt'); Dest.Free; Source.Free; end; |
|
Ok, dann mal eine Frage... was ist denn deiner Meinung nach der Inhalt von DecompressionStream? Außerdem weist man bei der TDecompressionKlasse den Inhalt schon beim Create zu (Source). Und noch was: Dest wurde schon wieder kein Inhalt zugewiesen.
Wahrlich ungetestet und es funktioniert nicht :wink:
mimi - Di 10.06.03 15:35
das komische es nur das onChange bei der memoe komponente garnicht ausgelöst wird.
tommie-lie - Di 10.06.03 16:42
Ich hab' jetzt mal ein wenig rumprobiert, ich krieg's auch nicht hin.
Ich habe eine BZip2-Unit, bei der klappt es (zwar nicht so, wie ich gepostet hab, aber immerhin :oops:), und der Autor dieser Unit hat sie der zLib nachempfunden, also sollte es mit der eigentlich genauso klappen, tut es aber seltsamerweise nicht...
Ich würde sagen, es wäre einfacher die BZip2 zu benutzen (Torry.net, da habe ich sie her, heißt auch BZip2). Mit Filestreams klappt es bei der zLib nämlich auch nicht...
mimi - Di 10.06.03 17:39
könntes du sie mir nocheinmal senden tommie-lie ?
dann mache ich es halt mit bzip2 hauptsache sie sind kleiner als vorhrer:)
mimi - Di 10.06.03 21:26
danke :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!