//////////////////////////////////////////////////////////////////////////////// // // **************************************************************************** // * Project : FWZip // * Unit Name : SplitZip // * Purpose : Демонстрация работы c разбитием архива // * 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 SplitZip; {$IFDEF FPC} {$MODE Delphi} {$H+} {$ELSE} {$APPTYPE CONSOLE} {$ENDIF} uses SysUtils, Classes, FWZipWriter, FWZipModifier; procedure AddItem(AWriter: TFWZipWriter; const AName, AData: string); var S: TStringStream; begin S := TStringStream.Create(AData); try S.Position := 0; AWriter.AddStream(AName, S); finally S.Free; end; end; var Writer: TFWZipWriter; Modifier: TFWZipModifier; Index: TReaderIndex; begin SetCurrentDir(ExtractFilePath(ParamStr(0))); try // создаем архив который будем разделять Writer := TFWZipWriter.Create; try // добавляем 4 элемента в архив AddItem(Writer, 'test1.txt', 'первый элемент'); AddItem(Writer, 'test2.txt', 'второй элемент'); AddItem(Writer, 'test3.txt', 'третий элемент'); AddItem(Writer, 'test4.txt', 'четвертый элемент'); // сохраняем Writer.BuildZip('..\..\DemoResults\split_main_archive.zip'); finally Writer.Free; end; // создаем экземпляр модификатора архивов Modifier := TFWZipModifier.Create; try // подключаем ранее созданный архив Index := Modifier.AddZipFile('..\..\DemoResults\split_main_archive.zip'); // добавляем из него первые два элемента Modifier.AddFromZip(Index, 'test1.txt'); Modifier.AddFromZip(Index, 'test2.txt'); // и сохраняем в новый архив // при этом реальной перепаковки данных не произойдет, // данные возьмутся как есть в виде массива байт прямо в сжатом виде // из оригинального архива Modifier.BuildZip('..\..\DemoResults\splited_archive1.zip'); // теперь удаляем добавленные элементы и добавляем вторые два Modifier.Clear; Modifier.AddFromZip(Index, 'test3.txt'); Modifier.AddFromZip(Index, 'test4.txt'); // сохраняем во торой архив Modifier.BuildZip('..\..\DemoResults\splited_archive2.zip'); finally Modifier.Free; end; // вот и все, мы разделили изначальный архив на две части // не занимаясь перепаковкой данных // как обьединять смотрите в примере MergeZip except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; Readln; end.