197 lines
8.3 KiB
ObjectPascal
Raw 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 : ReplaceZipItemData
// * Purpose : Демонстрация изменения данных в уже созданном архиве
// * Author : Александр (Rouse_) Багель
// * Copyright : © Fangorn Wizards Lab 1998 - 2023.
// * Version : 2.0.2
// * 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/
// http://www.base2ti.com/
//
// Данный пример показывает как можно изменить данные в уже созданном архиве
// без необходимости распаковки неизмененных элементов и их повторного сжатия.
program ReplaceZipItemData;
{$IFDEF FPC}
{$MODE Delphi}
{$H+}
{$ELSE}
{$APPTYPE CONSOLE}
{$ENDIF}
uses
SysUtils,
Classes,
FWZipReader,
FWZipModifier;
var
Modifier: TFWZipModifier;
Reader: TFWZipReader;
Index: TReaderIndex;
S: TStringStream;
I: Integer;
begin
SetCurrentDir(ExtractFilePath(ParamStr(0)));
try
// создаем экземпляр модификатора архивов
Modifier := TFWZipModifier.Create;
try
// подключаем ранее созданный архив
Index := Modifier.AddZipFile('..\..\DemoResults\split_main_archive.zip');
// добавляем из него первый элемент указывая его имя
Modifier.AddFromZip(Index, 'test1.txt');
// добавляем второй элемент, взяв имя из внутреннего ридера
Modifier.AddFromZip(Index, Modifier.Reader[Index].Item[1].FileName);
// вместо третьего пишем новые данные
S := TStringStream.Create('новые данные для третьего элемента архива');
try
S.Position := 0;
Modifier.AddStream('test3.txt', S);
finally
S.Free;
end;
// ну и добавляем последний элемент с одновременным изменением имени
Modifier.AddFromZip(Index, 'test4.txt', 'New test4.txt');
// теперь делаем новый архив,
// при этом данные от первого второго и четвертого элемента
// скопируются как есть без распаковки,
// а вместо третьего элемента будет добавлен новый блок данных
Modifier.BuildZip('..\..\DemoResults\replaced_data_archive1.zip');
finally
Modifier.Free;
end;
// предыдущий вариант был с сохранением порядка элемента в архиве
// если же порядок не важен, то можно сделать еще проще:
// создаем экземпляр модификатора архивов
Modifier := TFWZipModifier.Create;
try
// подключаем ранее созданный архив
Index := Modifier.AddZipFile('..\..\DemoResults\split_main_archive.zip');
// добавляем все элементы
Modifier.AddFromZip(Index);
// теперь удалим запись о третьем элементе
Modifier.DeleteItem(2);
// и пишем новые данные
S := TStringStream.Create('новые данные для третьего элемента архива');
try
S.Position := 0;
Modifier.AddStream('test3.txt', S);
finally
S.Free;
end;
// теперь делаем новый архив, принцип тот же самый
Modifier.BuildZip('..\..\DemoResults\replaced_data_archive2.zip');
finally
Modifier.Free;
end;
// третий вариант с передачей ридера снаружи, причем время жизни ридера
// контролирем мы сами
// Содаем ридер который будем использовать не только для модификации
// но и для каких-то своих задач
Reader := TFWZipReader.Create;
try
// читаем данные из ранее созданного тестового архива
Reader.LoadFromFile('..\..\DemoResults\split_main_archive.zip');
// создаем экземпляр модификатора архивов
Modifier := TFWZipModifier.Create;
try
// подключаем архив через доступный нам ридер
Index := Modifier.AddZipFile(Reader);
// добавляем из него все элементы кроме последнего
for I := 0 to Modifier.Reader[Index].Count - 2 do
Modifier.AddFromZip(Index, Modifier.Reader[Index].Item[I].FileName);
// вместо последнего пишем новые данные
S := TStringStream.Create('новые данные для последнего элемента архива');
try
S.Position := 0;
Modifier.AddStream('test4.txt', S);
finally
S.Free;
end;
// и ребилдим архив
Modifier.BuildZip('..\..\DemoResults\replaced_data_archive3.zip');
finally
Modifier.Free;
end;
finally
Reader.Free;
end;
// четвертый вариант, это небольшая модификация епрвого варианта,
// только подключение архива происходит так-же как и в третьем через ридер
// но в этот раз время жизни ридера будет контролировать модификатор
// создаем экземпляр модификатора архивов
Modifier := TFWZipModifier.Create;
try
// создаем экземпляр ридера
Reader := TFWZipReader.Create;
// открываем ранее созданный архив
Reader.LoadFromFile('..\..\DemoResults\split_main_archive.zip');
// и подкючаем его к модификатору указывая вторым параметром,
// что разрушать ридер должен модификатор
Index := Modifier.AddZipFile(Reader, roOwned);
// добавляем из него первый элемент указывая его имя
Modifier.AddFromZip(Index, 'test1.txt');
// добавляем второй элемент, взяв имя из внутреннего ридера
Modifier.AddFromZip(Index, Modifier.Reader[Index].Item[1].FileName);
// вместо третьего пишем новые данные
S := TStringStream.Create('новые данные для третьего элемента архива');
try
S.Position := 0;
Modifier.AddStream('test3.txt', S);
finally
S.Free;
end;
// ну и добавляем последний элемент
Modifier.AddFromZip(Index, 'test4.txt');
// теперь делаем новый архив,
// при этом данные от первого второго и четвертого элемента
// скопируются как есть без распаковки,
// а вместо третьего элемента будет добавлен новый блок данных
Modifier.BuildZip('..\..\DemoResults\replaced_data_archive4.zip');
finally
Modifier.Free;
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.