Урок 71 - Работа с сжатыми файлами

В этом уроке мы рассмотрим библиотеку "7z.dll", с её помощью можно распаковывать архивы такого типа:

     Zip, BZ2, Rar, Arj, Z, Lzh, 7z, Cab, Nsis, Lzma, Pe, Elf, Macho, Udf, Xar, Mub, Hfs, Dmg, Compound, Wim, Iso, Bkf, Chm, Split, Rpm, Deb, Cpio, Tar, GZip

   Практически все существующие архивы. Попытаемся распаковать архив типа Zip. Для этого создадим проект и сам архив, назовем его 1.zip и положим рядом с программой.

   На форму вытащим кнопочку и напишем в событии OnClick вот такой код:

begin
  // Распаковывает файлы 
  with CreateInArchive(CLSID_CFormatZip) do
   begin
     OpenFile(ExtractFilePath(ParamStr(0)) + '1.zip');
     ExtractTo(ExtractFilePath(ParamStr(0)) + '1');
   end;
end;
   После, рядом с программой появится папка "1", с содержимым архива. И не забудьте подключить в Uses модуль SevenZip, его вы найдете в конце данного урока.

   Также можно создать архив:
begin
  // Добавляет файлы 
  with CreateInArchive(CLSID_CFormatZip) do
   begin
	 Arch.AddFile('Имя файла');
	 Arch.SaveToFile('Имя архива');
   end; 


   Задать уровень сжатия можно функцией SetCompressionLevel(Arch: I7zOutArchive, Level: Integer);. Как видите все просто.

   Для работы с другими архивами надо изменить константу CLSID_CFormatZip . Например для .Rar архива, константа будет иметь вид CLSID_CFormatRar, полный список можно увидеть кликнув по константе с зажатым Ctrl.

Удачи!
Встретимся в следующем уроке!




Добавил(а): Oleg_Guz Дата: 2013-12-04
Работает на УРА!



Добавил(а): diggiti9105 Дата: 2013-12-13
выдает ошибку в юните 7z в начале, пишет не допустимы входной файл "п", если удалить он в другом месте выдает ошибку



Добавил(а): man1207 Дата: 2014-03-15
diggiti9105, открой файл блокнотом и в меню Кодировки выбери UTF-8 (без BOM), сохрани и будет тебе счастье.



Добавил(а): nik095 Дата: 2014-08-01
А никто не знает, как можно получить ClassId для CreateInArchive? Вариант посмотреть расширение файла архива не подходит )



Добавил(а): Zeld Дата: 2014-08-17
Чет у меня ни как не хочет работать, 7z.dll кинул в папку с проектом. SevenZip в Uses прописал. Но на на SevenZip в uses и ругается(



Добавил(а): Zeld Дата: 2014-08-17
Так, с SevenZip вопрос решил. Теперь, при выполнение распаковки архива, программа ругается на 7z.dll, хотя в папке всё ещё dll лежит



Добавил(а): Alexandr_7 Дата: 2016-01-21
Тоже самое может кто поможет решить проблему. SevenZip скачал от сюда. а САМИ БИБЛИОТЕКИ СПЕР У 64 БИТНОЙ 7Zip обе версии как 32 так и просто 7zip и положил вместе с проэктом.



Добавил(а): Alexandr_7 Дата: 2016-01-21
Решил проблему скачав 7zip для 32 битной винды и взяв от туда 7z.dll Но вопрос следующий. Как можно вывести процесс распаковки Помогите плиз.



Добавил(а): Oleg_Guz Дата: 2016-05-06
Arch.SetProgressCallback(nil,ProgressCallback);



Добавил(а): Tino Дата: 2016-10-22
--------------------------- Project1 --------------------------- Error loading library 7z.dll. --------------------------- ОК ---------------------------



Добавил(а): niaz-gtn Дата: 2017-09-06
7z.dll - приложите.



Добавил(а): Aqel Дата: 2018-08-15
Вопрос как распаковать только определённые папки/файлы?



Добавил(а): Pingitrus Дата: 2018-09-04
Есть еще кто нибудь живой на этом сайте, кто сможет помочь? Так то все работает, zip и rar распаковывает, но у меня есть файл dat который сжат GZip, почему то его не удается распаковать или так не получится так как этот файл не является архивом или является?)) пишет ошибку что неверная функция



Добавил(а): Aqel Дата: 2018-09-12
GZip псевдоархив, на мой вопрос тоже не отвечают, как распаковать отдельные файлы/папки...



Добавил(а): Aqel Дата: 2018-09-27
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;


  1. kamazman
    kamazman a year ago
    А с паролями на архивах как можно работал?
    Устанавливала и распаковывать (свой пароль знаю).
Отменить.