|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Распаковка определённых папок файлов из 7z (JEDI)
Есть функция - распаковывает полностью архив, а нужно что бы только опредёлённые папки и файлы:
Код:
function Decompress(FileName, DestDir: String): Boolean; var ArcClass: TJclDecompressArchiveClass; MyArc: TJclDecompressArchive; //WideString - Имена файлов begin Decompress:= False; // Filename = name.7z или name.zip // DestDir = полный путь к существующему каталогу //ArcClass:= GetArchiveFormats.FindDecompressFormat(FileName); ArcClass:= GetArchiveFormats.FindDecompressFormat(lowercase(FileName)); Application.ProcessMessages; Try if Assigned(ArcClass) then Begin MyArc:= ArcClass.Create(FileName); if (MyArc is TJclSevenZipDecompressArchive) then Begin try MyArc.ListFiles; { Сбой, не делая это первым } { ExtractAll (AutocreateSubDir) должен быть установлен верно } MyArc.ExtractAll(DestDir, True); //ExtractSelected(DestDir, True); !!! Полагаю надо это использовать, но как? Decompress:= True; except on E: EJclCompressionError do Begin ShowMessage(e.Message); End; end; End Else ShowMessage('Не поддерживаемая 7z.dll'); End; Finally MyArc.Free; End; end; Помогите, кто шарит в JclCompression... Всё намного проще, чем есть на самом деле... |
#2
|
||||
|
||||
Вот нашёл:
Код:
uses JclCompression; procedure TfrmSevenZipTest.Button1Click(Sender: TObject); const FILENAME = 'F:\temp\test.zip'; var archiveclass: TJclDecompressArchiveClass; archive: TJclDecompressArchive; item: TJclCompressionItem; s: String; i: Integer; begin archiveclass:= GetArchiveFormats.FindDecompressFormat(FILENAME); if not Assigned(archiveclass) then raise Exception.Create('Could not determine the Format of ' + FILENAME); archive:= archiveclass.Create(FILENAME); try if not (archive is TJclSevenZipDecompressArchive) then raise Exception.Create('This format is not handled by 7z.dll'); archive.ListFiles; s:= Format('test.zip Item Count: %d'#13#10#13#10, [archive.ItemCount]); for i:= 0 to archive.ItemCount - 1 do begin item:= archive.Items[i]; case item.Kind of ikFile: s:= s + IntToStr(i+1) + ': ' + item.PackedName + #13#10; ikDirectory: s:= s + IntToStr(i+1) + ': ' + item.PackedName + '\'#13#10;//' end; end; if archive.ItemCount > 0 then begin // archive.Items[0].Selected := true; // archive.ExtractSelected('F:\temp\test'); archive.ExtractAll('F:\temp\test'); end; ShowMessage(s); finally archive.Free; end; end; Распаковывает ВЕСЬ архив отлично, но как сделать только то что мне нужно распаковать (папки/файлы) ? Всё намного проще, чем есть на самом деле... Последний раз редактировалось Aqel, 13.08.2018 в 18:13. |
#3
|
||||
|
||||
Вот намудрил, но всё равно распаковывает весь архив:
Код:
function Decompress(FileName, DestDir, ArcFname: String; ArcDir: Boolean ): Boolean; var ArcClass: TJclDecompressArchiveClass; MyArc: TJclDecompressArchive; Item: TJclCompressionItem; i: Integer; begin ArcClass:= GetArchiveFormats.FindDecompressFormat(FileName); if not Assigned(ArcClass) then raise Exception.Create('Не удалось определить формат ' + FileName); MyArc:= ArcClass.Create(FileName); try if not (MyArc is TJclSevenZipDecompressArchive) then raise Exception.Create('Не поддерживаемая 7z.dll'); MyArc.ListFiles; Application.ProcessMessages; for i:= 0 to MyArc.ItemCount - 1 do begin item:= MyArc.Items[i]; if ArcFname = item.PackedName then MyArc.Items[i].Selected:= true; end; if MyArc.ItemCount > 0 then begin if ArcDir = False then MyArc.ExtractSelected(DestDir, true); if ArcDir then MyArc.ExtractAll(DestDir); //MyArc.ExtractAll(DestDir); end; finally MyArc.Free; end; ArcFname - имя файла для распаковки ArcDir - папка или файл (true/false) Всё намного проще, чем есть на самом деле... Последний раз редактировалось Aqel, 14.08.2018 в 13:01. |
#4
|
||||
|
||||
Вот код на основе sevezip.pas
Код:
uses ...sevenzip, ... function ProgressCallback(sender: Pointer; total: boolean; value: int64): HRESULT; stdcall; begin if total then Form1.sprgrsbr1.Max:= value else Form1.sprgrsbr1.Position:= value; Result:= S_OK; end; function Decompress(FileName, DestDir, ArcFname: String; ArcDir: Boolean ): Boolean; var i: Integer; ItP: string; items: array[1..11] of Cardinal; sprgrsbr1: TsProgressBar; begin Result:= False; Application.ProcessMessages; try with CreateInArchive(CLSID_CFormat7z) do begin OpenFile(FileName); SetProgressCallback(sprgrsbr1, ProgressCallback); for i:= 1 to NumberOfItems - 1 do if not ItemIsFolder[i] then //ExtractItem(items[i], Steam, False); - как ей пользоваться в душе не понимаю... ExtractTo(DestDir); end; finally Result:= True; end; end; Этот код идеально работает (лучше чем JEDI) - распаковывает архив с прогрессбаром, но вопрос распаковки определённых файлов/папок всё равно есть... Вот файлы: Всё намного проще, чем есть на самом деле... Последний раз редактировалось Aqel, 28.09.2018 в 08:26. |