107 lines
3.9 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.