Delphi XE2的.Z Unix压缩文件库

3

我需要管理.Z(Unix压缩)文件,主要是解压缩功能。什么是最好的库来完成这个任务?更倾向于避免使用Dll(如7z.dll)。编辑:今天我有一个解决方案,使用JCL压缩库接口到7z.dll。我只是想寻找一个更轻便和简单的解决方案,因为我只需要'.Z'的解压缩功能。


.Z文件由C语言编写的ZLIB读取/写入。Delphi的几个部分使用它,因此二进制.obj文件版本(使用旧的Borland C编译器编译)包含在delphi中。您可以静态链接到它。Jedi JCL库显示了如何在其示例文件夹中使用它,而JVCL将jedi JCL包装器包装成组件形式,其中包括TJvZLibMultiple。http://stackoverflow.com/questions/1450510/compress-all-files-but-skip-one - Warren P
1
@Warren,.Z文件由“compress”工具管理,该工具使用LZW压缩算法。Zlib处理带有deflate算法的.gz和.zip文件。虽然gzip工具经典上是Zlib的接口,但它实际上可以处理两种压缩格式,但Zlib本身仍然只用于deflate,而不是LZW。 - Rob Kennedy
1
不,@Warren,情况恰恰相反。Deflate是LZ77加上Huffman编码。Gzip是deflate加上头部和校验和。LZW是LZ78加上Welch编码和一个(现在已过期的)专利。维基百科和手册都有相关介绍。因此,在Intraweb中的gzip内容可能对解压.Z文件没有太大帮助,除非它们实际上是gzip压缩的文件,但错误地给了.Z文件扩展名。 - Rob Kennedy
1
@philnext,我在链接中找到了LZW Delphi实现的'LZW.pas'。也许这是你需要的轻量级解决方案?顺便说一下,你可能需要先注册才能获得访问权限。 - Hendra
1
@philnext,这里还有一个链接 - Hendra
显示剩余9条评论
1个回答

1

要解压缩.Z文件,我只需使用Delphi XE2内置的ZLib库:

uses ...,ZLib;

procedure UnpackFiles;
var
  LList: TStringDynArray;
  I: Integer;
  FileName: String;
  DestFileName: String;
  LUnZip: TZDecompressionStream;
  LInput, LOutput: TFileStream;
begin
  LList:= TDirectory.GetFiles(ImportDir, '*.gz');
  for i:= 0 to Length(LList)-1 do
  begin
    FileName:= LowerCase(LList[i]);
    DestFileName:= ChangeFileExt(FileName, '.csv');
    { Create the Input, Output, and Decompressed streams. }
    LInput := TFileStream.Create(FileName, fmOpenRead);
    LOutput := TFileStream.Create(DestFileName, fmCreate);
    LUnZip := TZDecompressionStream.Create(LInput, 15+16); // 16 = read as gzip header !

    Log(Format('create uncompressed file %s', [DestFileName]));
    { Decompress data. }
    LOutput.CopyFrom(LUnZip, 0);

    { Free the streams. }
    LUnZip.Free;
    LInput.Free;
    LOutput.Free;
    Log(Format('Delete compressed file %s', [FileName]));
    DeleteFile(FileName);
  end;
end;

重要的部分是设置选项以读取gzip头:
LUnZip := TZDecompressionStream.Create(LInput, 15+16); // 16 = read as gzip header !

1
从文档中:windowBits 可以大于 15,用于可选的 gzip 解码。将 windowBits 加上 32 可以启用带有自动头部检测的 zlib 和 gzip 解码,或者加上 16 仅解码 gzip 格式(zlib 格式将返回 Z_DATA_ERROR)。如果正在解码 gzip 流,则 strm->adler 是 crc32 而不是 adler32。 - LU RD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接