JarUnPacker/prereq/fwzip/Demos/Extract ZIP 2/ExctractZIPDemo2.dpr
2023-02-02 12:02:14 +03:00

127 lines
3.9 KiB
ObjectPascal

////////////////////////////////////////////////////////////////////////////////
//
// ****************************************************************************
// * Project : FWZip
// * Unit Name : ExctractZIPDemo2
// * Purpose : Äåìîíñòðàöèÿ ðàñïàêîâêè çàøèôðîâàííîãî àðõèâà.
// * Author : Àëåêñàíäð (Rouse_) Áàãåëü
// * Copyright : © Fangorn Wizards Lab 1998 - 2013.
// * Version : 1.0.10
// * 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
// http://zlib.net/zlib-1.2.5.tar.gz
// http://www.base2ti.com/
//
// Äàííûé ïðèìåð ïîêàçûâàåò ñîçäàíèå è ðàñïàêîâêó çàøèôðîâàííîãî àðõèâà.
// Äëÿ äåìîíñòðàöèè ðàáîòû ñî ñïèñêîì ïàðîëåé ìû ñîçäàäèì àðõèâ,
// â êîòîðîì êàæäîìó ýëåìåíòó íàçíà÷èì ïðîèçâîëüíûé ïàðîëü èç ñïèñêà.
// Ïðè ÷åì êîä èçëå÷åíèÿ äàííûõ íå áóäåò çíàòü êàêîìó ôàéëó
// êàêîé èç ïàðîëåé ñîîòâåòñòâóåò è åñòü ëè ïàðîëü âîîáùå.
program ExctractZIPDemo2;
{$APPTYPE CONSOLE}
uses
SysUtils,
FWZipWriter,
FWZipReader,
FWZipConsts;
const
PasswordList: array [0..3] of string = (
'', 'password1', 'password2', 'password3');
procedure OnPassword(Self, Sender: TObject; const FileName: string;
var Password: string; var CancelExtract: Boolean);
begin
Password := PasswordList[3];
end;
var
Writer: TFWZipWriter;
Reader: TFWZipReader;
Item: TFWZipWriterItem;
I: Integer;
ExtractResult: TExtractResult;
Method: TMethod;
begin
SetCurrentDir(ExtractFilePath(ParamStr(0)));
try
Writer := TFWZipWriter.Create;
try
// Äëÿ íà÷àëà äîáàâèì â êîðåíü àðõèâà ôàéëû èç êîðíåâîé äèðåêòîðèè
Writer.AddFolder('..\..\', False);
// Òåïåðü íàçíà÷èì èì ïàðîëè ñëó÷àéíûì îáðàçîì
Randomize;
// Ó ïåðâîãî ýëåìåíòà ïàðîëü âñåãäà áóäåò ïðèñóòñòâîâàòü (äëÿ äåìîíñòðàöèè)
Item := Writer[0];
Item.Password := PasswordList[Random(3) + 1];
Item.NeedDescriptor := True;
for I := 1 to Writer.Count - 1 do
begin
Item := Writer[I];
// Åñëè èñïîëüçóåòñÿ øèôðîâàíèå æåëàòåëüíî âêëþ÷àòü äåñêðèïòîð ôàéëà
// ñì. Readme.txt
Item.NeedDescriptor := True;
Item.Password := PasswordList[Random(4)];
end;
// Ñîõðàíÿåì ðåçóëüòàò
ForceDirectories('..\DemoResults\');
Writer.BuildZip('..\DemoResults\ExctractZIPDemo2.zip');
finally
Writer.Free;
end;
Reader := TFWZipReader.Create;
try
Reader.LoadFromFile('..\DemoResults\ExctractZIPDemo2.zip');
// Òåïåðü íàøà çàäà÷à èçâëå÷ü äàííûå èç àðõèâà
//  ðó÷íîì ðåæèìå ðàñïàêîâêè ïðèäåòñÿ ïåðåáèðàòü ïàðîëè ñàìîñòîÿòåëüíî
// Íàïðèìåð âîò òàê:
I := 0;
repeat
ExtractResult := Reader[0].Extract(
'..\DemoResults\ExctractZIPDemo2\ManualExtract\', PasswordList[I]);
Inc(I);
until ExtractResult <> erNeedPassword;
// Åñëè ïðåäïîëàãàåòñÿ èñïîëüçîâàòü ðåæèì àâòîìàòè÷åñêîé ðàñïàêîâêè,
// òî óêàçàòü ïàðîëè ìîæíî äâóìÿ ñïîñîáàìè
// 1. ÷åðåç ñïèñîê ïàðîëåé
Reader.PasswordList.Add(PasswordList[1]);
Reader.PasswordList.Add(PasswordList[2]);
// 2. ÷åðåç îáðàáîò÷èê
Method.Code := @OnPassword;
Method.Data := Reader;
Reader.OnPassword := TZipNeedPasswordEvent(Method);
// äëÿ äåìîíñòðàöèè â ñïèñîê ïàðîëåé äîáàâëåíû òîëüêî äâà ïàðîëÿ
// òðåòèé áóäåò ïåðåäàí ÷åðåç îáðàáîò÷èê ñîáûòèÿ OnPassword
Reader.ExtractAll('..\DemoResults\ExctractZIPDemo2\');
finally
Reader.Free;
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.