代码之家  ›  专栏  ›  技术社区  ›  maf-soft

使用Delphi进行GZip流压缩(可选使用tar)

  •  2
  • maf-soft  · 技术社区  · 6 年前

    我在Delphi10中搜索了几个小时,用streams创建了一个有效的.tar.gz文件。

    我可以用 LibTar ,效果很好。

    System.ZLib . 秘密在于WindowBits参数:

    // 31 bit wide window = gzip only mode
    DecompStream:= TZDecompressionStream.Create(SourceStream, 15 + 16);
    TarStream:= TTarArchive.Create(DecompStream);
    TarStream.Reset;
    while TarStream.FindNext(DirRec) do {...} TarStream.ReadFile(TargetStream);
    

    太好了!但真的有可能 系统.ZLib 是否能够解压gzip(我猜只需忽略gzip头+16?),但不能自己创建这样的头?无论我尝试什么,我只得到一个7zip或WinRar无法打开的文件,因为缺少头文件。

    似乎,许多其他人也有这个问题-我发现并尝试了多种解决方案,以添加这个标题,但没有真正的工作,一切都需要添加长单位(不好,但可以接受),甚至DLL(不接受我)。

    1 回复  |  直到 6 年前
        1
  •  1
  •   maf-soft    6 年前

    秘密在于 WindowBits 参数-听起来很熟悉?:)

    System.ZLib 德尔福东京资料来源:

    在windowBits中添加16位来编写一个简单的gzip头和 gzip头将没有文件名,没有额外的数据,没有注释,没有 修改时间(设置为零)、无头crc和操作 系统将设置为255(未知)。

    TargetStream:= TFileStream.Create(TargetFilename, fmCreate);
    CompressStream:= TZCompressionStream.Create(TargetStream, zcDefault, 15 + 16);
    TarStream:= TTarWriter.Create(CompressStream);
    TarStream.AddStream(SourceStream1, SourceFilename1, Now);
    TarStream.AddString(SourceString2, SourceFilename2, Now);