2015-01-27 2 views
0

Я использую следующий код для извлечения файлов из архива SevenZIP. Он хорошо работает с однотомными архивами, но не работает с несколькими томами.Decompress multivolume SevenZip файл с JCLCompression

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 будет обрабатывать его автоматически?

ответ

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

Предположительно abbrevia делает лучшую работу? –

+0

OT: Вы знаете об этой проблеме (http://stackoverflow.com/questions/27821277/why-are-the-delphi-zlib-and-zip-libraries-so-slow-under-64-bit)? Думаю, это может повлиять на аббревиатуру, если она использует запас Emba zlib. –

+0

@DavidHeffernan Abbrevia не обрабатывает .7z архивы, так что _no_, но да, это поведение .zip расщепления работает и полностью автоматизировано. v5.0 улучшил это довольно немного. –

Смежные вопросы