Delphi XE 8 - 如何解压缩 gzip 文件?

标签 delphi delphi-xe8

我正在使用 Delphi XE 8 并尝试解压缩 gzip 文件。 我直接从 Embarcadero 网站复制了以下代码作为示例,但我收到“EZDecompressionError,并显示消息“数据错误”。

procedure DecompressGzip(inFileName : string);
var
  LInput, LOutput: TFileStream;
  LUnZip: TZDecompressionStream;

begin
  { Create the Input, Output, and Decompressed streams. }
  LInput := TFileStream.Create(InFileName, fmOpenRead);
  LOutput := TFileStream.Create(ChangeFileExt(InFileName, 'txt'), fmCreate);
  LUnZip := TZDecompressionStream.Create(LInput);

  { Decompress data. }
  LOutput.CopyFrom(LUnZip, 0);
  { Free the streams. }
  LUnZip.Free;
  LInput.Free;
  LOutput.Free;
end;

我尝试解压缩的示例文件位于此处: http://ftp.nhc.noaa.gov/atcf/aid_public/

最佳答案

您的代码是正确的,但您忘记启用 zlib 来检测 gzip header (默认情况下,唯一识别的数据格式是 zlib 格式)。您必须调用 TDecompressionStream.Create(source: TStream; WindowBits: Integer) 重载构造函数,并指定 zlib 应在流中查找 gzip 的深度标题:

procedure TForm2.FormCreate(Sender: TObject);
var
  FileStream: TFileStream;
  DecompressionStream: TDecompressionStream;
  Strings: TStringList;
begin
  FileStream := TFileStream.Create('aal012015.dat.gz', fmOpenRead);
{
     windowBits can also be greater than 15 for optional gzip decoding.  Add
   32 to windowBits to enable zlib and gzip decoding with automatic header
   detection, or add 16 to decode only the gzip format (the zlib format will
   return a Z_DATA_ERROR).
}
  DecompressionStream := TDecompressionStream.Create(FileStream, 15 + 16);  // 31 bit wide window = gzip only mode

  Strings := TStringList.Create;
  Strings.LoadFromStream(DecompressionStream);

  ShowMessage(Strings[0]);

  { .... }
end;

如需进一步引用,请查看zlib manual ,还有 this question可能有用。

关于Delphi XE 8 - 如何解压缩 gzip 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31221429/

相关文章:

Delphi:使组件对实时绑定(bind)可见

delphi - 语音识别效果不佳

delphi - 单击相关链接将转到大约 :<relative link> which does not show wanted page

Delphi MDI - 处理打开/关闭/激活子窗体

Delphi重新启动Windows

delphi - 我可以使用 generics.defaults 比较 Real48 吗?

delphi - 无法在 XE8 中部署 Ad Hoc Release

delphi - 使用 TIdSSLIOHandlerSocketOpenSSL 时 idSMTP 连接超时

facebook - 在 Delphi 中将 Facebook created_time 转换为 TDateTime

delphi - 当 BiDiMode= bdRightToLeft 和 Style= csDropDownList 且应用程序使用 VCL 样式时,TComboBoxEx 项目无法正确绘制