108 lines
3.9 KiB
ObjectPascal
108 lines
3.9 KiB
ObjectPascal
////////////////////////////////////////////////////////////////////////////////
|
||
//
|
||
// ****************************************************************************
|
||
// * Project : FWZip
|
||
// * Unit Name : ExctractZIPDemo1
|
||
// * Purpose : Демонстрация распаковки архива.
|
||
// * : Используется архив созданный демоприложением CreateZIPDemo1
|
||
// * Author : Александр (Rouse_) Багель
|
||
// * Copyright : © Fangorn Wizards Lab 1998 - 2023.
|
||
// * Version : 2.0.1
|
||
// * Home Page : http://rouse.drkb.ru
|
||
// * Home Blog : http://alexander-bagel.blogspot.ru
|
||
// ****************************************************************************
|
||
// * Stable Release : http://rouse.drkb.ru/components.php#fwzip
|
||
// * Latest Source : https://github.com/AlexanderBagel/FWZip
|
||
// ****************************************************************************
|
||
//
|
||
// Используемые источники:
|
||
// ftp://ftp.info-zip.org/pub/infozip/doc/appnote-iz-latest.zip
|
||
// https://zlib.net/zlib-1.2.13.tar.gz
|
||
// http://www.base2ti.com/
|
||
//
|
||
|
||
// Данный пример показывает два варианта извлечения информации из архива.
|
||
|
||
program ExctractZIPDemo1;
|
||
|
||
{$IFDEF FPC}
|
||
{$MODE Delphi}
|
||
{$H+}
|
||
{$ELSE}
|
||
{$APPTYPE CONSOLE}
|
||
{$ENDIF}
|
||
|
||
uses
|
||
Classes,
|
||
SysUtils,
|
||
TypInfo,
|
||
FWZipReader,
|
||
FWZipUtils;
|
||
|
||
function ExtractResultStr(Value: TExtractResult): string;
|
||
begin
|
||
Result := GetEnumName(TypeInfo(TExtractResult), Integer(Value));
|
||
end;
|
||
|
||
var
|
||
Zip: TFWZipReader;
|
||
Index: Integer;
|
||
M: TStringStream;
|
||
begin
|
||
SetCurrentDir(ExtractFilePath(ParamStr(0)));
|
||
try
|
||
Zip := TFWZipReader.Create;
|
||
try
|
||
// Открываем ранее созданный архив
|
||
Zip.LoadFromFile('..\DemoResults\CreateZIPDemo1.zip');
|
||
|
||
// Первый вариант распаковки - ручной доступ к каждому элементу архива
|
||
|
||
// В примере CreateZIPDemo1 мы создали в корне архива файл Test.txt
|
||
// Нам необходимо получить индекс этого элемента в архиве
|
||
Index := Zip.GetElementIndex('test.txt');
|
||
if Index >= 0 then
|
||
begin
|
||
// Распаковать можно в память:
|
||
M := TStringStream.Create('');
|
||
try
|
||
Zip[Index].ExtractToStream(M, '');
|
||
// Файл извлечен, выведем его содержимое в окно консоли
|
||
{$IFDEF UNICODE}
|
||
Writeln(M.DataString);
|
||
{$ELSE}
|
||
{$IFDEF FPC}
|
||
Writeln(M.DataString);
|
||
{$ELSE}
|
||
Writeln(ConvertToOemString(AnsiString(M.DataString)));
|
||
{$ENDIF}
|
||
{$ENDIF}
|
||
finally
|
||
M.Free;
|
||
end;
|
||
|
||
// Распаковать так-же можно на диск:
|
||
Write('Extract "', Zip[Index].FileName, '": ');
|
||
Writeln(ExtractResultStr(
|
||
Zip[Index].Extract('..\DemoResults\CreateZIPDemo1\ManualExtract\', '')));
|
||
end;
|
||
|
||
// Таким-же образом можно получить содержимое остальных файлов
|
||
|
||
// Второй вариант распаковки - автоматической распаковка архива
|
||
// в указанную папку на диске
|
||
Zip.ExtractAll('..\DemoResults\CreateZIPDemo1\');
|
||
|
||
// Третий вариант распаковки - автоматическая распаковка по маске
|
||
// (данный код распакует все файлы находящиеся в папке AddFolderDemo архива)
|
||
Zip.ExtractAll('AddFolderDemo*', '..\DemoResults\CreateZIPDemo1\ExtractMasked\');
|
||
finally
|
||
Zip.Free;
|
||
end;
|
||
except
|
||
on E: Exception do
|
||
Writeln(E.ClassName, ': ', E.Message);
|
||
end;
|
||
Readln;
|
||
end.
|