197 lines
6.3 KiB
ObjectPascal
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.
|