Hallo,
Ich habe ein Problem mit meinem Code. Und zwar habe ich ein Test-Programm geschrieben, um die Funktionsweise zu überprüfen, bevor ich die Funktionen in das richtige Programm einbinde.
Nach Button1.Click packt das Programm einen String in eine Datei. Nach Button2.Click liest es die Datei aus und dekomprimiert sie.
Aber genau in der Dekomprimierungs-Prozedur ist ein Fehler drin, den ich noch nicht gefunden habe:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TForm1.Button1Click(Sender: TObject); var SFS2: tFileStream; SCFS2: TBZDecompressionstream; clearstream: tFileStream; text: WideString;
begin SFS2 := tFileStream.Create('C:\comp_test.test', fmOpenRead); SFS2.Seek(0, soFromBeginning); SCFS2 := TBZDecompressionStream.Create(SFS2); SCFS2.Read(text, SFS2.Size); clearstream := tFileStream.Create('c:\comp_clear.test', fmCreate); clearstream.Seek(0, soFromBeginning); clearstream.Write(PChar(text)^, Length(text)); //Hier ist der Fehler clearstream.Free; SCFS2.Free; SFS2.Free; end; |
Das mit dem Stream-im-Stream ist richtig und beim Packen geht's auch, nur eben beim Entpacken nicht. Der Fehler geschieht aber seltsamerweise erst nach dem Entpacken, wenn ich versuche den String in eine andere Datei zu schreiben (überprüft durch die Step- und Trace-Funktionen in Delphi). Erkennt einer den Fehler?
Die Fehlermeldung, die Delphi ausgibt besagt, daß mein Programm eine "EAccessViolation"-Exception in Addresse 40007334 in Modul RTL60.BPL erhoben hat. Wodurch diese Zugriffs-Verletzung nun entsteht, weiß ich nicht. Die Datei "comp_clear.test" existiert und auch im angegebenen Verzeichnis (\). Sie bleibt aber durch den Fehler leer (Länge von 0 Bytes, kein Inhalt).
Es kann aber kein genereller Fehler beim Schreiben sein, denn wie schon gesagt, beim Komprimieren, schreibt er auch in einen Stream (Datei "comp_clear.test").
Falls es einer schon erkannt hat: Die Stream-Klassen kommen von einem anderen Post von mir ("bzip2, nur wie?", in "Dateizugriff") und sind theoretisch fehlerfrei, da sie aus dem Internet heruntergeladen sind. Der Link auf "bzip2, nur wie" ist nicht mehr gültig, da der angegebene Provider (userhp.com) pleite gemacht hat.
Daher ist die Datei BZIP2.PAS jetzt auf
www.nelie.org/tommielie/BZIP2.PAS (wieder auf GROß- und klein-Schreibung achten)
verfügbar. Den Link in dem anderen Post werde ich auch gleich noch ändern.
Wer sich also die Stream-Klasse "TBZDecompressionStream" anschauen will, kann das bei nelie.org tun.
Bye
tommie-lie
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk.