【问题标题】:Decompress multivolume SevenZip file with JCLCompression使用 JCLCompression 解压缩多卷 SevenZip 文件
【发布时间】:2015-01-27 09:53:55
【问题描述】:

我正在使用以下代码从 SevenZIP 存档中提取文件。它适用于单卷存档,但不适用于多卷。

procedure TMyClass.ExtractArchive(AInputFile:String;AOutputDir:String);
var
 LArchive:TJcl7zDecompressArchive;
begin
 LArchive:=TJcl7zDecompressArchive.Create(AInputFile);
 try
  LArchive.OnProgress:=ExtractProgress;
  LArchive.ListFiles();
  try
   LArchive.ExtractAll(AOutputDir);
  except
   on e:Exception do
    LogError(e);
  end;
 finally
  LArchive.Free();
 end;
end;

SevenZip 的卷似乎只是分成两半的文件(与 RAR 和 ZIP 档案相反)。我是否必须自己手动准备组合流(所有卷为一个)?还是 JCL 会以某种方式自动处理?

【问题讨论】:

    标签: delphi 7zip


    【解决方案1】:

    Jcl 7zip 类不能很好地处理读取现有的拆分档案。它具有获取卷名的回调,但如果它们不在单独的可移动驱动器上,最简单的方法是在打开之前手动添加所有卷:

    if AnsiEndsText(AInputFile, '.001') then
    begin 
      LArchive := TJcl7zDecompressArchive.Create(AInputFile, GetFileSize(AInputFile, nil));
      for VolumeIndex := 2 to 999 do begin
        VolumeName := ChangeFileExt(AInputFile, Format('.%.3d', [VolumeIndex]));
        VolumeSize := GetFileSize(VolumeName, nil);
        if VolumeSize = INVALID_FILE_SIZE then
          Break;
        LArchive.AddVolume(VolumeName, VolumeSize);
      end
    end
    else
      LArchive := TJcl7zDecompressArchive.Create(AInputFile);
    

    【讨论】:

    • 大概 abbrevia 做得更好?
    • OT:你知道这个问题吗 (stackoverflow.com/questions/27821277/…)?我想如果它使用股票 Emba zlib 可能会对 abbrevia 产生影响。
    • @DavidHeffernan Abbrevia 不处理 .7z 档案,所以,,但是是的,它的 .zip 拆分行为有效并且是全自动的。 v5.0 对此进行了相当大的改进。
    • @DavidHeffernan Abbrevia 实际上包含了 DEFLATE 算法的洁净室 Pascal 实现;它根本不依赖 zlib。 32 位的比 zlib 慢一点,结果大约大 10%,但它也支持 DEFLATE64 变体,而 zlib 不支持。我还没有对 64 位变体进行基准测试。无论如何,由于 Embarcadero 支付了 fork Abbrevia 的费用,并且不愿意与我合作以向后移植更改,因此我不再积极维护原始项目。
    • @Tom 我们在内部使用的代码看起来几乎与此相同,并且似乎对 JCL 没有任何影响它的更改。唯一的区别是我们使用的是 TJcl7zUpdateArchive 而不是 TJcl7zDecompressArchive
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 2015-07-09
    • 2015-01-10
    相关资源
    最近更新 更多