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

Показать сообщение отдельно

Аватара для 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