使用JCLCompression解压缩多卷SevenZip文件

时间:2015-01-27 09:53:55

标签: delphi 7zip

我使用以下代码从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会以某种方式自动处理它?<​​/ p>

1 个答案:

答案 0 :(得分:2)

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);