Цитата Painkiller:
Одна проблема решена , а вот, если нужно распаковать папку с файлами из архива.... »
|
В SevenZip целый класс для этого. Код со старой заготовки...., должен работать
Код:
// ----------------------------------------------------------------------
{ распаковать архив }
procedure Unzip7z_All(aCompressFileName: string);
var
Zz: I7zInArchive;
outDir: string;
begin
Zz := CreateInArchive(CLSID_CFormat7z);
with Zz do // интерфейс архива
begin
OpenFile(aCompressFileName); // имя архива
outDir := ChangeFileExt(aCompressFileName, ''); // выходной каталог
ForceDirectories(outDir); // создать
ExtractTo(outDir);
end;
end;
{ применение }
procedure TForm1.btn1Click(Sender: TObject);
begin
Unzip7z_All(ExtractFilePath(Application.ExeName) + 'Архив.7z');
end;
// ----------------------------------------------------------------------
{ извлечь файл из архива }
Unzip7z_ExtractFile(const aCompressFileName: string;
const aOutSaveFileName: string): Boolean;
var
fs: TFileStream;
i: Integer;
InArchive: I7zInArchive;
Item: string;
begin
Result := False;
if not FileExists(aCompressFileName) then
begin
ShowMessage('File no found');
Exit;
end;
InArchive := CreateInArchive(CLSID_CFormat7z);
try
try
InArchive.OpenFile(aCompressFileName);
if InArchive.NumberOfItems > 0 then
begin
for i := 0 to InArchive.NumberOfItems - 1 do
begin
Item := InArchive.ItemPath[i];
if not InArchive.ItemIsFolder[i] then
begin
if Item = ( { 'Имя папки в архиве\' + } ExtractFileName(aOutSaveFileName)) then
begin
if FileExists(aOutSaveFileName) then
DeleteFile(aOutSaveFileName);
fs := TFileStream.Create(aOutSaveFileName,
fmCreate or fmOpenWrite);
try
InArchive.ExtractItem(i, fs, False);
finally
FreeAndNil(fs);
end;
end;
end;
Break;
end;
end;
except
on E: Exception do
begin
Result := False;
end;
end;
finally
InArchive := nil;
end;
end;
{ применение }
procedure TForm1.btn2Click(Sender: TObject);
begin
if Unzip7z_ExtractFile(ExtractFilePath(Application.ExeName) + 'Архив.7z',
'Имя файла.txt') then
ShowMessage('No found file');
end;