127 lines
3.9 KiB
ObjectPascal
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.
|