107 lines
3.2 KiB
ObjectPascal

////////////////////////////////////////////////////////////////////////////////
//
// ****************************************************************************
// * Project : FWZip
// * Unit Name : SplitZip
// * Purpose : Äåìîíñòðàöèÿ ðàáîòû c ðàçáèòèåì àðõèâà
// * Author : Àëåêñàíäð (Rouse_) Áàãåëü
// * Copyright : © Fangorn Wizards Lab 1998 - 2023.
// * Version : 2.0.0
// * 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 SplitZip;
{$IFDEF FPC}
{$MODE Delphi}
{$H+}
{$ELSE}
{$APPTYPE CONSOLE}
{$ENDIF}
uses
SysUtils,
Classes,
FWZipWriter,
FWZipModifier;
procedure AddItem(AWriter: TFWZipWriter; const AName, AData: string);
var
S: TStringStream;
begin
S := TStringStream.Create(AData);
try
S.Position := 0;
AWriter.AddStream(AName, S);
finally
S.Free;
end;
end;
var
Writer: TFWZipWriter;
Modifier: TFWZipModifier;
Index: TReaderIndex;
begin
SetCurrentDir(ExtractFilePath(ParamStr(0)));
try
// ñîçäàåì àðõèâ êîòîðûé áóäåì ðàçäåëÿòü
Writer := TFWZipWriter.Create;
try
// äîáàâëÿåì 4 ýëåìåíòà â àðõèâ
AddItem(Writer, 'test1.txt', 'ïåðâûé ýëåìåíò');
AddItem(Writer, 'test2.txt', 'âòîðîé ýëåìåíò');
AddItem(Writer, 'test3.txt', 'òðåòèé ýëåìåíò');
AddItem(Writer, 'test4.txt', '÷åòâåðòûé ýëåìåíò');
// ñîõðàíÿåì
Writer.BuildZip('..\..\DemoResults\split_main_archive.zip');
finally
Writer.Free;
end;
// ñîçäàåì ýêçåìïëÿð ìîäèôèêàòîðà àðõèâîâ
Modifier := TFWZipModifier.Create;
try
// ïîäêëþ÷àåì ðàíåå ñîçäàííûé àðõèâ
Index := Modifier.AddZipFile('..\..\DemoResults\split_main_archive.zip');
// äîáàâëÿåì èç íåãî ïåðâûå äâà ýëåìåíòà
Modifier.AddFromZip(Index, 'test1.txt');
Modifier.AddFromZip(Index, 'test2.txt');
// è ñîõðàíÿåì â íîâûé àðõèâ
// ïðè ýòîì ðåàëüíîé ïåðåïàêîâêè äàííûõ íå ïðîèçîéäåò,
// äàííûå âîçüìóòñÿ êàê åñòü â âèäå ìàññèâà áàéò ïðÿìî â ñæàòîì âèäå
// èç îðèãèíàëüíîãî àðõèâà
Modifier.BuildZip('..\..\DemoResults\splited_archive1.zip');
// òåïåðü óäàëÿåì äîáàâëåííûå ýëåìåíòû è äîáàâëÿåì âòîðûå äâà
Modifier.Clear;
Modifier.AddFromZip(Index, 'test3.txt');
Modifier.AddFromZip(Index, 'test4.txt');
// ñîõðàíÿåì âî òîðîé àðõèâ
Modifier.BuildZip('..\..\DemoResults\splited_archive2.zip');
finally
Modifier.Free;
end;
// âîò è âñå, ìû ðàçäåëèëè èçíà÷àëüíûé àðõèâ íà äâå ÷àñòè
// íå çàíèìàÿñü ïåðåïàêîâêîé äàííûõ
// êàê îáüåäèíÿòü ñìîòðèòå â ïðèìåðå MergeZip
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.