Werner Pamler wrote:
Another question: I would prefer to avoid Abbrevia altogether and use the standard zip support in fpc. There are examples in the wiki on how to use the TDecompressionStream for inflating gzip files. But I always get a "data error"at least with the mailinglist archive files from http://lists.lazarus.freepascal.org/pipermail/lazarus/. If I use a TGZFileStream instead of the TDecompressionStream by a TGZFileStream, then the file decompresses fine. But this is not a good solution as I would have to use temporary files which I want to avoid. How can the TGZFileStream be modified such that it accepts a stream as input parameter instead of a filename?
It should be possible to use inflateInit2 from paszlib.
I've found a snippet here: http://www.gocher.me/GZIP

If you take GZIPUtils.pas, at first you think it should work, but it didn't. The only thing I found was that that code only takes a header of 9 bytes into account while the 2015-November.txt.gz has a header of 71 bytes. So if I change the following in ZUncompressStream I could successfully extract 2015-November.txt:

On line 178:
    // inStream.Position := 10; // jump over header
inStream.Position := 72; // jump over header, this needs to be adjusted to read a string until #0

========
procedure TForm1.Button1Click(Sender: TObject);
var
  inStream, outStream: TMemoryStream;
begin
  inStream := TMemoryStream.Create;
  outStream := TMemoryStream.Create;
  try
    inStream.LoadFromFile('c:\temp\2015-November.txt.gz');
    if ZUncompressStream(inStream, outStream) then
    begin
      outStream.SaveToFile('c:\temp\2015-November.txt');
    end;
  finally
    inStream.Free;
    outStream.Free;
  end;
end;
========
Of course in your final code you should read a string until #0 from the file and position it correctly to begin at the real data.

You could also strip the deflate-part of that unit (or completely create your own implementation from this source). It's not much code after you strip all the things you don't need.

Grtz,
/Rik/ (rvk on forum)

--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to