我需要管理.Z(Unix压缩)文件,主要是解压缩功能。什么是最好的库来完成这个任务?更倾向于避免使用Dll(如7z.dll)。编辑:今天我有一个解决方案,使用JCL压缩库接口到7z.dll。我只是想寻找一个更轻便和简单的解决方案,因为我只需要'.Z'的解压缩功能。
要解压缩.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;
LUnZip := TZDecompressionStream.Create(LInput, 15+16); // 16 = read as gzip header !
windowBits
可以大于 15,用于可选的 gzip 解码。将 windowBits
加上 32 可以启用带有自动头部检测的 zlib 和 gzip 解码,或者加上 16 仅解码 gzip 格式(zlib 格式将返回 Z_DATA_ERROR)。如果正在解码 gzip 流,则 strm->adler
是 crc32 而不是 adler32。 - LU RD
.obj
文件版本(使用旧的Borland C编译器编译)包含在delphi中。您可以静态链接到它。Jedi JCL库显示了如何在其示例文件夹中使用它,而JVCL将jedi JCL包装器包装成组件形式,其中包括TJvZLibMultiple。http://stackoverflow.com/questions/1450510/compress-all-files-but-skip-one - Warren Pgzip
工具经典上是Zlib的接口,但它实际上可以处理两种压缩格式,但Zlib本身仍然只用于deflate,而不是LZW。 - Rob Kennedy