131 lines
5.2 KiB
ObjectPascal
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

////////////////////////////////////////////////////////////////////////////////
//
// ****************************************************************************
// * 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.