Урок 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;
|
Устанавливала и распаковывать (свой пароль знаю).