Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.09.2018, 17:27   #1
Aqel
Пользователь
 
Аватар для Aqel
 
Регистрация: 07.05.2011
Сообщений: 24
Печаль Распаковка определённых файлов/папок из 7zip (sevenzip.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;
Как распаковать только нужные, кто знает подскажите..?

Вот файлы 7zip
Всё намного проще, чем есть на самом деле...

Последний раз редактировалось Aqel; 28.09.2018 в 08:12. Причина: Добавил файл
Aqel вне форума Ответить с цитированием
Старый 29.09.2018, 20:12   #2
Mazahaka_lab
 
Регистрация: 08.11.2015
Сообщений: 9
По умолчанию

Никак, я с этим тоже столкнулся. Пока распаковываю, используя ключи командной строки. Да и sevenzip.pas не идеальный, заточенный под старую dll. Esd формат он не распакует.
Mazahaka_lab вне форума Ответить с цитированием
Старый 29.09.2018, 20:30   #3
Aqel
Пользователь
 
Аватар для Aqel
 
Регистрация: 07.05.2011
Сообщений: 24
По умолчанию

То есть через .bat распаковываешь? Примерчик можно?
Всё намного проще, чем есть на самом деле...
Aqel вне форума Ответить с цитированием
Старый 29.09.2018, 21:42   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Цитата:
Сообщение от Mazahaka_lab Посмотреть сообщение
Никак, я с этим тоже столкнулся. Пока распаковываю, используя ключи командной строки. Да и sevenzip.pas не идеальный, заточенный под старую dll. Esd формат он не распакует.
Всё там можно извлечь и по одиночке, поискав пусть в списке файлов и извлечь конкретный объект по его индексу.

Писал когда-то такую вспомогательную функцию:
Код:
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;
Первое - открытый интерфейс архива.
Второе - путь к тому что распаковать,
третье - куда распокавать
На выход:
true - распаковано
false - не распаковано.

В любой непонятной ситуации - false.
Человек_Борща вне форума Ответить с цитированием
Старый 30.09.2018, 13:26   #5
Mazahaka_lab
 
Регистрация: 08.11.2015
Сообщений: 9
По умолчанию

Человек_Борща , использую вашу функцию так
Код:
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.
Чего-то не распаковывает =(

Последний раз редактировалось Mazahaka_lab; 30.09.2018 в 14:24.
Mazahaka_lab вне форума Ответить с цитированием
Старый 03.10.2018, 22:38   #6
Mazahaka_lab
 
Регистрация: 08.11.2015
Сообщений: 9
По умолчанию

Проблема решена !
Mazahaka_lab вне форума Ответить с цитированием
Старый 04.10.2018, 13:55   #7
Mazahaka_lab
 
Регистрация: 08.11.2015
Сообщений: 9
По умолчанию

С файлом понятно, а как извлечь определённую папку из архива ?
Mazahaka_lab вне форума Ответить с цитированием
Старый 05.10.2018, 16:37   #8
Aqel
Пользователь
 
Аватар для Aqel
 
Регистрация: 07.05.2011
Сообщений: 24
По умолчанию

Вот мой вариант:
Код:
procedure TForm1.btn3Click(Sender: TObject); 
var
  Arc7z: I7zInArchive;
begin
  if dlg1.Execute then
    if FileExists(dlg1.FileName) then
    begin
      aNV := dlg1.FileName; // Файл архива
      pNV := ExtractFilePath(aNV); // Путь файла архива
      Arc7z := CreateInArchive(CLSID_CFormatZip);
      Arc7z.OpenFile(aNV);
      SevenZip_ExtractFile(Arc7z, 'readme.txt', pNV + '\Unpack');
    end;
end;
Что то у меня ошибка "неверная функция" пишет...
Всё намного проще, чем есть на самом деле...

Последний раз редактировалось Aqel; 06.10.2018 в 13:30.
Aqel вне форума Ответить с цитированием
Старый 07.10.2018, 00:18   #9
Mazahaka_lab
 
Регистрация: 08.11.2015
Сообщений: 9
По умолчанию

Цитата:
Сообщение от Aqel Посмотреть сообщение
Вот мой вариант:
Код:
procedure TForm1.btn3Click(Sender: TObject); 
var
  Arc7z: I7zInArchive;
begin
  if dlg1.Execute then
    if FileExists(dlg1.FileName) then
    begin
      aNV := dlg1.FileName; // Файл архива
      pNV := ExtractFilePath(aNV); // Путь файла архива
      Arc7z := CreateInArchive(CLSID_CFormatZip);
      Arc7z.OpenFile(aNV);
      SevenZip_ExtractFile(Arc7z, 'readme.txt', pNV + '\Unpack');
    end;
end;
Что то у меня ошибка "неверная функция" пишет...
Ты zip распаковываешь или 7z? В твоём примере в шапке 7z , а тут CLSID_CFormatZip. Определись
Mazahaka_lab вне форума Ответить с цитированием
Старый 07.10.2018, 17:50   #10
Aqel
Пользователь
 
Аватар для Aqel
 
Регистрация: 07.05.2011
Сообщений: 24
По умолчанию

Цитата:
Сообщение от Mazahaka_lab Посмотреть сообщение
Ты zip распаковываешь или 7z? В твоём примере в шапке 7z , а тут CLSID_CFormatZip. Определись
Ууупс!!! Пропустил... Спс!!!
Всё намного проще, чем есть на самом деле...
Aqel вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа с sevenzip.pas Volkogriz Общие вопросы Delphi 2 11.06.2013 22:31
Распаковка файлов 7zip с п омощью JScript syt Помощь студентам 0 11.11.2011 14:04
Распаковка файлов Растаман Помощь студентам 3 09.05.2011 09:51
Работа с компонентом SevenZip (7zip) в Delphi Claster Помощь студентам 0 04.04.2011 13:16