![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
||||
|
||||
|
Есть функция - распаковывает полностью архив, а нужно что бы только опредёлённые папки и файлы:
Код:
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. |