197 lines
6.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.