Plobleme mit Streams
-
Hallo zusammen,
in meinem Programm muss ich Logdateien (*.gz) entpacken und packen. Dazu habe ich mir die Klasse TZlib von Richard W. Frost genommen. Die Funktionen Compress und Decompress erwarten jeweils einen InputStream und einen OutputStream.
[code type="C++" tabs]
int Compress(TStream *input, TStream *output, int level);
int Decompress(TStream *input, TStream *output);
[/cpp]Leider habe ich noch nie mit Streams gearbeitet, die Hilfe dazu ist sehr dürftig und so wie ich es mir vorstelle funktioniert es nicht
Sicherlich könnte es auch in Bug in der Klasse sein - jedoch halte ich einen Programmierfehler meinerseits für wahrscheinlicher.void __fastcall TForm1::compress(TObject *Sender) { TZlib* ZipObjekt = new TZlib(); TFileStream* ZipDatei = new TFileStream("c:\\test.gz", fmCreate); TFileStream* AlteDatei = new TFileStream("c:\\access.log.50", fmOpenRead); if (ZipObjekt->Compress(AlteDatei, ZipDatei, 9) != 0) { Application->MessageBoxA("Fehler", "Fehler beim komprimieren", MB_ICONWARNING); } delete ZipDatei; delete AlteDatei; delete ZipObjekt; }
Diese Routine sollte die Datei access.log.50 gzippen. Die Datei erscheint auch und die Rückgabe von Compress lässt auf einen erfolgreichen Vorgang schließen, jedoch lässt sich die Datei anschließend nicht von einem Standardprogramm (WinRAR, gzip, tar) öffnen (Fehlerhafte Datei) und das entpacken mit...
void __fastcall TForm1::decompress(TObject *Sender) { TZlib* ZipObjekt = new TZlib(); TFileStream* ZipDatei = new TFileStream("c:\\test.gz", fmOpenRead); TFileStream* TXTDatei = new TFileStream("c:\\neu.txt", fmCreate); int RG = ZipObjekt->Decompress(TXTDatei, ZipDatei); int test = RG; delete ZipObjekt; delete ZipDatei; delete TXTDatei; }
...schläg mit einem negativen Status fehl.
Ich vermute, dass die Streams nicht ordnungsgemäß geschlossen werden bzw. dass irgendwelche Headers nicht mit auf die Platte geschrieben werden.
Oder gehe ich vollkommen falsch mit Streams um??Bitte helft mir,
Stefan
Wenn jemand eine andere (möglichst kostenlose) Klasse/Kompo kennen sollte, die gzip liest und schreibt, bitte auch hier posten...
[ Dieser Beitrag wurde am 25.02.2003 um 20:10 Uhr von heuki editiert. ]
-
Hi, Heuki
Dein Prog muesste eigentlich so geh'n :o .
Ich hab' eins fast identisch gemacht, geht
Ich mach nur eins anders:
TZlib* ZipObjekt = new TZlib; //OHNE Klammern!!!???
Ob WinZip o. a. die Dinger lesen, weis ich nicht.
Hab' mal probiert, WINZIP liest die Dinger NICHT!!!
[ Dieser Beitrag wurde am 25.02.2003 um 20:28 Uhr von DerAltenburger editiert. ]
-
Hallo,
erstmal vielen Dank für Deine schnelle Antwort
Also hab die Klammern mal weggemacht und wie ich eigentlich schon fast erwartet habe, hat sich nicht viel geändert
Vielleicht ist es ja tatsächlich ein Bug in TZlib. Welche Version benutzt Du denn?Hast Du auch schon andere Streams benutzt? Das ist nämlich erstmal nur ein Test der Klasse. im Prinzip muss ich den Stream mit TStringStream als String im Speicher auslesen (Die entpackte Datei)
Meine Idee dazu sah so aus:
TFileStream* ZipDatei = new TFileStream(FileName ,fmOpenRead); TStringStream* StringStream = new TStringStream(""); int RG = ZipObjekt->Decompress(ZipDatei, StringStream); Memo1->Text = StringStream->DataString;
Stimmt das soweit??
Hat nicht funktioniert, kann aber auch an vorherigem Fehler liegen...
Grüße,
Stefan
-
Also ich hab
in FormCreate:
ZLib= new TZlib;
in FormDestroy
delete ZLib;in ZIPClick: (ist der Button zum Zippen) TFileStream *FStrIn,*FStrOut; if (FileListBox1->FileName.Length()>0) { ZIP->Tag=1; FStrIn=new TFileStream(FileListBox1->FileName,fmOpenRead); if (CDirectoryOutlineEx1->Directory[CDirectoryOutlineEx1->Directory.Length()]!='\\') FStrOut=new TFileStream(CDirectoryOutlineEx1->Directory.operator +("\\").operator +(Target->Text),fmCreate); else FStrOut=new TFileStream(CDirectoryOutlineEx1->Directory.operator +(Target->Text),fmCreate); ZLib->Compress(FStrIn,FStrOut,9); Label3->Caption="Done"; delete FStrOut; delete FStrIn; } in UNZIPClick (Button Unzip) TFileStream *FStrIn,*FStrOut; if (FileListBox1->FileName.Length()>0) { UNZIP->Tag=1; FStrIn=new TFileStream(FileListBox1->FileName,fmOpenRead); if (CDirectoryOutlineEx1->Directory[CDirectoryOutlineEx1->Directory.Length()]!='\\') FStrOut=new TFileStream(CDirectoryOutlineEx1->Directory.operator +("\\").operator +(Target->Text),fmCreate); else FStrOut=new TFileStream(CDirectoryOutlineEx1->Directory.operator +(Target->Text),fmCreate); ZLib->Decompress(FStrIn,FStrOut); Label3->Caption="Done"; delete FStrOut; delete FStrIn; UNZIP->Tag=0; }
Das geht bei mir!?
PS: CDirectoryOutlineEx is 'ne eigene Kompo als Dir- Tree - in ->Directory steht voller Pfad!
-
Also das ist wirklich komisch. Bei den Streams sehe ich keinen Unterschied.
Könntest Du mir denn vielleicht doch mal die Version nennen? (Steht in der TZlib.cpp) Meine Versioin istWritten: 01/06/98
Modified: 01/15/98und benutzt die Zlib v1.0.4 (Ist also schon was älter...)
Wenn Du eine neuere Version hast, könntest Du die vielleicht mal posten (ist ja Open Source) oder mir per Mail schicken?Grüße,
Stefan
-
Das versteh ich net:
Version ist bei mir dieselbe?
Written: 01/06/98
Modified: 01/15/98ZLib : 1.0.4, Jul 24th, 1996 Copyright (C)
Hat die erzeugte ZIP- Datei 'ne Groesse?
Koente Dateien mailen. (Weis aber nicht genau welche Dateien dazugehoehren
[ Dieser Beitrag wurde am 25.02.2003 um 21:57 Uhr von DerAltenburger editiert. ]
-
Ja, sie hatte eine Größe...
habe das Problem jetzt "gelöst"...
also die zip-Routine scheint gestimmt zu haben. Mit Deiner Unzip-Routine klappt es jetzt auch, obwohl ich immer noch sicher bin, dass sich die Routinen nicht unterscheiden...
Werde mir das auf jeden Fall nochmal ansehen (irgendwo muss mein Fehler ja liegen)Habe das ganze gerade mal an einer eigenen *.gz-Datei ausprobiert, damit funktioniert es aber nicht
Normalerweise kapselt die TZlib doch die ZLib, die das Format GnuZip unterstützt. Oder was stimmt hier nicht???
Grüße,
Stefan
-
Hi Heuki (oder Stefan)
EDV = Ende Der Vernunft ! ! !
Also ich seh' auch keine Unterschiede (ausser 2x (), das muss aber eigentlich sein?!)
Ich erzeuge ZLib einmal in Create, Du jedesmal bei ZIP und UNZIP!?
Das ist aber eigentlich WurschtDas ander Zipper das nicht lesen ist klar: In der Zip- Datei fehlen Hilfsdaten wie Dateiname und Pfad, das machen 'ordentliche Zipper 'rein!!!
!!!Kannst ja Deine UNZIP- Routine 'mal löschen und neu eintippen (nicht kopieren!), vielleicht geht's dann auch? (In QuellCode koennen 'unsichtbare Zeichen stehen !(hohe ASCII- Codes), die Fehler verursachen). Bei mir hat neuschreiben manchmal geholfen!