Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - [sevenzip] Как распаковать определённый файл из архива 7zip

Ответить
Настройки темы
Delphi - [sevenzip] Как распаковать определённый файл из архива 7zip

Аватара для Painkiller

Ветеран


Автор проектов


Сообщения: 1158
Благодарности: 382

Профиль | Отправить PM | Цитировать


Изменения
Автор: Painkiller
Дата: 04-10-2018
Вложения
Тип файла: 7z SevenZipIntf.7z
(9.4 Kb, 21 просмотров)
Всем привет! Есть задача распаковать определённый файл из архива 7zip. Воспользовался модулем (прикрепил к теме).
Использую функцию
Код: Выделить весь код
uses
...sevenzip, ...

function SevenZip_ExtractFile(const aInterf: I7zInArchive; const aPath: string;  const aSavePath: string): Boolean;
var  i, indx: Integer;  fs: TFileStream;  s1, s2: string;
begin  Result := False;  indx := -1;  for i := 0 to aInterf.NumberOfItems - 1
do  begin    if (not aInterf.ItemIsFolder[i])
then    begin
s1 := LowerCase(Trim((aInterf.ItemPath[i] + aInterf.ItemName[i]))); 
s2 := LowerCase(Trim(aPath));
if (s1 = s2)  then      begin 
indx := i;
Break;
end;    end;  end;
if (indx <> -1) then  begin
try      fs := TFileStream.Create(aSavePath, fmCreate or fmOpenWrite); 
try        aInterf.ExtractItem(indx, fs, False);        Result := True;
 finally        FreeAndNil(fs);      end;    except      Result := False;
 end;  
end; 
end;

// Пытаюсь  распаковать:
procedure TForm1.Button1Click(Sender: TObject);
var Zz: I7zInArchive;
begin Zz:= CreateInArchive(CLSID_CFormat7z);
Zz.OpenFile('C:\hidcon.7z'); if SevenZip_ExtractFile(Zz,'hidcon_x64.exe','C:\3333') then begin caption:='1' end else begin caption:='0' ;
end; end; end.
И получаю всегда 0 . Ничего не распаковывает. Где я ошибся ? Ошибок при компиляции нет.

Решил проблему так :
Новый модуль прикрепил к теме .
Сам код :
Код: Выделить весь код
uses
 SevenZipIntf

function SevenZip_ExtractFile(const aInterf: I7zInArchive; const aPath: string;
const aSavePath: string): Boolean;
var
i, indx: Integer;
fs: TFileStream;
s1, s2: string;
begin
Result := False;
indx := -1;
for i := 0 to aInterf.NumberOfItems - 1 do
begin
if (not aInterf.ItemIsFolder[i]) then
begin
s1 := LowerCase(Trim((aInterf.ItemPath[i] + aInterf.ItemName[i])));
s2 := LowerCase(Trim(aPath));
if (s1 = s2) then
begin
indx := i;
Break;
end;
end;
end;
if (indx <> -1) then
begin
try
fs := TFileStream.Create(aSavePath, fmCreate or fmOpenWrite);
try
aInterf.ExtractItem(indx, fs, False);
Result := True;
finally
FreeAndNil(fs);
end;
except
Result := False;
end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Zz: I7zInArchive;
begin
Zz:= CreateInArchive(CLSID_CFormat7z,'директория где лежит 7z.dl');
Zz.OpenFile('C:\sevenzip.7z');
if SevenZip_ExtractFile(Zz,'sevenzip.pas','C:\sevenzip.pas') then begin
caption:='готово' end else begin
caption:='ошибка' ;
end;
end;

-------
http://wiki.oszone.net/images/0/03/UserbarAAA4.gif


UpdatePack 7 для интеграции обновлений в образ Windows 7 SP1 [X86\64]

UpdatePack 8.1 для интеграции обновлений в образ Windows 8.1 [X86\64]

UpdatePack 10 для интеграции обновлений в образ Windows 10 [X86\64]

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:49, 03-10-2018

 

Аватара для Painkiller

Ветеран


Автор проектов


Сообщения: 1158
Благодарности: 382

Профиль | Отправить PM | Цитировать


Как всегда проблему решил сам. Вопрос решён . Нашёл модуль по новее и чуть переписал функцию и всё заработало

-------
http://wiki.oszone.net/images/0/03/UserbarAAA4.gif


UpdatePack 7 для интеграции обновлений в образ Windows 7 SP1 [X86\64]

UpdatePack 8.1 для интеграции обновлений в образ Windows 8.1 [X86\64]

UpdatePack 10 для интеграции обновлений в образ Windows 10 [X86\64]


Отправлено: 22:14, 03-10-2018 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Painkiller, тогда дело за малым осталось — привести ссылку на:
Цитата Painkiller:
модуль по новее »
и новый код для:
Цитата Painkiller:
чуть переписал функцию »
.

Отправлено: 22:34, 03-10-2018 | #3


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Painkiller, спасибо! Родина Вас не забудет !

Отправлено: 00:21, 04-10-2018 | #5


Аватара для Painkiller

Ветеран


Автор проектов


Сообщения: 1158
Благодарности: 382

Профиль | Отправить PM | Цитировать


Цитата Iska:
Painkiller, спасибо! Родина Вас не забудет ! »
Одна проблема решена , а вот, если нужно распаковать папку с файлами из архива . Функция работает только с файлами . Действительно проще было все реализовать запуск через консольный 7zip с определёнными ключами + имитацию прогрессбара прикрутить . Также до сих пор я не знаю как добавить в модуль поддержку распаковки esd формата.

-------
http://wiki.oszone.net/images/0/03/UserbarAAA4.gif


UpdatePack 7 для интеграции обновлений в образ Windows 7 SP1 [X86\64]

UpdatePack 8.1 для интеграции обновлений в образ Windows 8.1 [X86\64]

UpdatePack 10 для интеграции обновлений в образ Windows 10 [X86\64]


Отправлено: 00:53, 04-10-2018 | #6


Аватара для opel431

Ветеран


Contributor


Сообщения: 1803
Благодарности: 714

Профиль | Отправить PM | Цитировать


Цитата 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;

-------
Хвала тому, кто встав среди камней, уча другого, сам будет умней.


Последний раз редактировалось opel431, 04-10-2018 в 11:18.


Отправлено: 09:33, 04-10-2018 | #7


Аватара для Painkiller

Ветеран


Автор проектов


Сообщения: 1158
Благодарности: 382

Профиль | Отправить PM | Цитировать


opel431, ай -яй -яй
Код: Выделить весь код
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;
Если на то пошло , то бы сделали так

Код: Выделить весь код
procedure Unzip7z_All(aCompressFileName, outDir: string);
var
 Zz: I7zInArchive;
begin
 Zz := CreateInArchive(CLSID_CFormat7z);
 with Zz do // интерфейс архива
 begin
 OpenFile(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;
Эта разве функция сможет извлечь определённую папку с файлами из архива ?

-------
http://wiki.oszone.net/images/0/03/UserbarAAA4.gif


UpdatePack 7 для интеграции обновлений в образ Windows 7 SP1 [X86\64]

UpdatePack 8.1 для интеграции обновлений в образ Windows 8.1 [X86\64]

UpdatePack 10 для интеграции обновлений в образ Windows 10 [X86\64]


Последний раз редактировалось Painkiller, 04-10-2018 в 12:13.


Отправлено: 12:03, 04-10-2018 | #8


Аватара для opel431

Ветеран


Contributor


Сообщения: 1803
Благодарности: 714

Профиль | Отправить PM | Цитировать


Цитата Painkiller:
opel431, ай -яй -яй »
Ай -яй -яй, так ай -яй -яй! Вам дал пример использования класса, если понимаете о чем идет речь, рассматривая его как основу, а как Вы будете использовать свои обвертки для класса, Ваши проблемы. Так что, ай -яй -яй возьмите обратно!

-------
Хвала тому, кто встав среди камней, уча другого, сам будет умней.


Последний раз редактировалось opel431, 04-10-2018 в 12:59.


Отправлено: 12:50, 04-10-2018 | #9


Аватара для Painkiller

Ветеран


Автор проектов


Сообщения: 1158
Благодарности: 382

Профиль | Отправить PM | Цитировать


opel431, я не знаю как распаковать определённую папку из архива , а не целый архив . С файлом и так понятно уже, решил сам как всегда, зачем возвращаться к этому ?
Так же интересует вопрос :
Цитата Painkiller:
как добавить в модуль поддержку распаковки esd формата. »
Цитата opel431:
Ай -яй -яй, так ай -яй -яй! Вам дал пример использования класса, если понимаете о чем идет речь, рассматривая его как основу, а как Вы будете использовать свои обвертки для класса, Ваши проблемы. Так что, ай -яй -яй возьмите обратно! »
Это было не оскорбление, не воспринимайте вы так слова близко к сердцу.

-------
http://wiki.oszone.net/images/0/03/UserbarAAA4.gif


UpdatePack 7 для интеграции обновлений в образ Windows 7 SP1 [X86\64]

UpdatePack 8.1 для интеграции обновлений в образ Windows 8.1 [X86\64]

UpdatePack 10 для интеграции обновлений в образ Windows 10 [X86\64]


Последний раз редактировалось Painkiller, 04-10-2018 в 14:04.


Отправлено: 13:50, 04-10-2018 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - [sevenzip] Как распаковать определённый файл из архива 7zip

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Как распаковать файл формата nanddump? Diman19 Хочу все знать 1 22-02-2018 23:53
CMD/BAT - [решено] Извлечь из архива только определенную папку/определенный файл SharkyEXE Скриптовые языки администрирования Windows 34 09-08-2017 22:34
Утилита для создания/изменения 7zip SFX-архива XXXler Автоматическая установка Windows 2000/XP/2003 38 24-06-2017 14:23
Разное - Как "спасти" файл из повреждённого архива ? MKN Программирование и базы данных 1 03-03-2008 11:06
Как распаковать файл на удаленном компе? phpbook Вебмастеру 3 10-06-2004 22:31




 
Переход