131 lines
4.2 KiB
ObjectPascal
131 lines
4.2 KiB
ObjectPascal
////////////////////////////////////////////////////////////////////////////////
|
||
//
|
||
// ****************************************************************************
|
||
// * Project : FWZip
|
||
// * Unit Name : ModifyMultiPartZip
|
||
// * Purpose : Демонстрация модификации многотомного архива
|
||
// * 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 ModifyMultiPartZip;
|
||
|
||
{$IFDEF FPC}
|
||
{$MODE Delphi}
|
||
{$H+}
|
||
{$ELSE}
|
||
{$APPTYPE CONSOLE}
|
||
{$ENDIF}
|
||
|
||
uses
|
||
SysUtils,
|
||
Classes,
|
||
TypInfo,
|
||
FWZipZLib,
|
||
FWZipWriter,
|
||
FWZipStream,
|
||
FWZipModifier;
|
||
|
||
var
|
||
Writer: TFWZipWriter;
|
||
S: TStringStream;
|
||
MultiStreamRead, MultiStreamWrite: TFWFileMultiStream;
|
||
Modifier: TFWZipModifier;
|
||
I, Index1, Index2: Integer;
|
||
BuildZipResult: TBuildZipResult;
|
||
begin
|
||
SetCurrentDir(ExtractFilePath(ParamStr(0)));
|
||
try
|
||
|
||
// Модификация многотомного архиве ничем не отличается от модификации
|
||
// обычного архива, за исключением использования наследников
|
||
// TFWAbstractMultiStream для чтения и записи
|
||
|
||
// Например возьмем архив созданный в примере CreateMultyPartZip.dpr
|
||
// и удалим из него все *.pas файлы.
|
||
// А так-же добавим файлы из обычного не многотомного архива
|
||
|
||
MultiStreamRead := TFWFileMultiStream.CreateRead(
|
||
'..\..\DemoResults\MultyPartZip\MultyPartZip.zip');
|
||
try
|
||
|
||
Modifier := TFWZipModifier.Create;
|
||
try
|
||
// загружаем многотомный архив в модификатор
|
||
Index1 := Modifier.AddZipFile(MultiStreamRead);
|
||
|
||
// добавляем все элементы архива
|
||
Modifier.AddFromZip(Index1);
|
||
|
||
// удаляем все PAS файлы
|
||
for I := Modifier.Count - 1 downto 0 do
|
||
if AnsiLowerCase(ExtractFileExt(Modifier[I].FileName)) = '.pas' then
|
||
Modifier.DeleteItem(I);
|
||
|
||
// теперь создадим простой архив
|
||
Writer := TFWZipWriter.Create;
|
||
try
|
||
S := TStringStream.Create('Просто тестовые данные для демонстрации');
|
||
Writer.AddStream('test_stream.txt', S, soOwned);
|
||
Writer.BuildZip('..\..\DemoResults\MultyPartZip\stream.zip')
|
||
finally
|
||
Writer.Free;
|
||
end;
|
||
|
||
// загружаем обычный архив в модификатор
|
||
Index2 := Modifier.AddZipFile('..\..\DemoResults\MultyPartZip\stream.zip');
|
||
|
||
// добавляем единственный элемент простого архива
|
||
Modifier.AddFromZip(Index2, 'test_stream.txt');
|
||
|
||
// ... и сохранияем все в новый архив
|
||
// Причем!
|
||
// т.к. мы не указываем второй параметр, отвечающий за размер каждого тома
|
||
// то он берется по умолчанию и новый архив будет сформирован с томами
|
||
// другого размера, чем был в изначальном архиве.
|
||
// Все изменения произойдут на лету, вам не нужно их контролировать.
|
||
|
||
MultiStreamWrite := TFWFileMultiStream.CreateWrite(
|
||
'..\..\DemoResults\MultyPartZip\MultyPartZipWithoutPas.zip');
|
||
try
|
||
BuildZipResult := Modifier.BuildZip(MultiStreamWrite);
|
||
finally
|
||
MultiStreamWrite.Free;
|
||
end;
|
||
|
||
finally
|
||
Modifier.Free;
|
||
end;
|
||
|
||
finally
|
||
MultiStreamRead.Free;
|
||
end;
|
||
|
||
// ... выводим результат
|
||
Writeln(GetEnumName(TypeInfo(TBuildZipResult), Integer(BuildZipResult)));
|
||
|
||
except
|
||
on E: Exception do
|
||
Writeln(E.ClassName, ': ', E.Message);
|
||
end;
|
||
Readln;
|
||
end.
|