我使用以下代码从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>
答案 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);