197 lines
8.3 KiB
ObjectPascal
197 lines
8.3 KiB
ObjectPascal
////////////////////////////////////////////////////////////////////////////////
|
||
//
|
||
// ****************************************************************************
|
||
// * 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.
|