Перейти к содержанию
Fire Monkey от А до Я
  • 0

Компонент/библиотека для работы с bzip2


Partisan

Вопрос

Приветствую!

Портирую приложение на Delphi 7, использующее сжатие файлов данных с помощью bzip2, на мобильные платформы. В десктоп-версии использовалась библиотека BZip2 unit by Edison Mera, но она не подходит, т.к. линкует сишные .obj. Что посоветуете, желательно с поддержкой потоков?

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Алгоритм bzip2 создан в 1996 году. И уже 15 лет назад он считался медленным и неэффективным. Вы уверены что без него не обойтись?

Ссылка на комментарий
  • 0
21 час назад, Евгений Корепов сказал:

Вы уверены что без него не обойтись?

Если не менять формат файлов, то да.

Если менять, что посоветуете из того что совместимо c multi-device FMX и Delphi 7?

Ссылка на комментарий
  • 0
4 часа назад, Partisan сказал:

Если не менять формат файлов, то да.

Если менять, что посоветуете из того что совместимо c multi-device FMX и Delphi 7?

Посоветую не сжимать данные. За последние 10-15 лет объемы хранилищ несколько увеличились, скорости передачи тоже, так что скорее всего сжатие уже неактуально.

Ссылка на комментарий
  • 0

А стандартные библиотеки если использовать, типа System.Zip?

  zip: TZipFile;

  zip := TZipFile.Create;
  zip.Open(TPath.Combine(TPath.GetDocumentsPath, 'DATA.zip'), TZipMode.zmRead);
  zip.ExtractAll(TPath.GetDocumentsPath);
  zip.Close;
  zip.free;

Ссылка на комментарий
  • 0
В 02.11.2019 в 19:24, CyberStorm сказал:

А стандартные библиотеки если использовать, типа System.Zip?

  zip: TZipFile;

  zip := TZipFile.Create;
  zip.Open(TPath.Combine(TPath.GetDocumentsPath, 'DATA.zip'), TZipMode.zmRead);
  zip.ExtractAll(TPath.GetDocumentsPath);
  zip.Close;
  zip.free;

zip, в отличие от bzip, не умеет работать с TMemoryStream, по крайней мере в штатной комплектации.

Ссылка на комментарий
  • 0
11 часов назад, pivbul сказал:

zip, в отличие от bzip, не умеет работать с TMemoryStream, по крайней мере в штатной комплектации.

Вы ошибаетесь. TZipFile отлично работает с TStream и остальными TMemoryStream, TFileStream и т.д.

Вот пример:

uses  System.Zip;
....

procedure TForm1.Test();
var FZip : TZipFile;
    AArchiveStream : TStream;
    AFileStreamSource : TStream;
    ADecompressionStream, AFileStreamDest : TStream;
    ALocalHeader : TZipHeader;
    AArchivePath, AFileSourcePath, AFileName : String;
begin
  AArchivePath := 'D:\0\005\test.zip';

  AFileSourcePath := 'D:\0\005\test.txt';
  AFileName := TPath.GetFileName(AFileSourcePath);

  // Добавляем в архив
  AFileStreamSource := TFileStream.Create('D:\0\005\test.txt', fmOpenRead);
  AArchiveStream := TFileStream.Create(AArchivePath, fmCreate);
  FZip := TZipFile.Create;
  FZip.Open(AArchiveStream, TZipMode.zmWrite);
  FZip.Add(AFileStreamSource, AFileName, TZipCompression.zcDeflate);
  FZip.Close;
  FZip.Free;
  AArchiveStream.Free;

  // распаковываем из архива
  FZip := TZipFile.Create;
  AArchiveStream := TFileStream.Create(AArchivePath, fmOpenRead or fmShareDenyNone);
  FZip.Open(AArchiveStream, TZipMode.zmRead);
  FZip.Read(AFileName, ADecompressionStream, ALocalHeader);
  AFileStreamDest := TFileStream.Create('D:\0\005\test_dest.txt', fmCreate);
  AFileStreamDest.CopyFrom(ADecompressionStream, ADecompressionStream.Size);
  AFileStreamDest.Free;
  ADecompressionStream.Free;
  FZip.Close;
  FZip.Free;
  AArchiveStream.Free;
end;

В примере берем файл D:\0\005\test.txt и архивируем его в архив 'D:\0\005\test.zip. Потом достаем из этого архива файл test.txt и сохраняем как D:\0\005\test_dest.txt. Все через потоки. Код написан на коленке, при использовании в реальной задаче вам нужно добавить критические секции и обработчики try finally.

Кстати вы можете использовать и сжатие BZIP2. В данном примере замените TZipCompression.zcDeflate на TZipCompression.zcBZIP2, ну и самое интересное для разработчика - напишите свою реализацию алгоритма архивирования и зарегистрируйте ее с помощью 

FZip.RegisterCompressionHandler(TZipCompression.zcBZIP2, .....); 

Да, это будет не просто, но опыта наберетесь с лихвой.

Ссылка на комментарий
  • 0

Добавлю - если у вас цель экономия трафика через мобильные сети, то вы можете использовать https://docwiki.embarcadero.com/Libraries/Sydney/en/System.ZLib.TZCompressionStream для сжатия данных перед передачей.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...