пятница, 21 апреля 2017 г.

ZLib в Delphi до Unicode

Пример использования библиотеки ZLib в версиях без поддержки Unicode.
Сайт библиотеки http://zlib.net/, на нем есть ссылка на интерфейсы для Delphi http://www.base2ti.com/?id=delphi.zlib.

procedure CompressFile(SourceFileName,DestFileName:string);
var
  SourceFileStream:TFileStream;
  DestFileStream:TFileStream;
  CompressStream:TCompressionStream;
  bytecount : Integer;
begin
  //Архивируем измененный файл
  //поток исходного файла
  SourceFileStream:=TFileStream.Create(SourceFileName,fmOpenRead);
  //поток файла архива
  DestFileStream:=TFileStream.Create(DestFileName,fmCreate);
  //размер исходного файла
  bytecount:=SourceFileStream.Size;
  try
    //в начала архива запишем исходный размер
    DestFileStream.Write(bytecount,sizeof(bytecount));
    //Создадим архивирующий поток, в конструктор передадим тип архивации и поток файла архива
    CompressStream := TCompressionStream.Create(clDefault,DestFileStream);
    try
      //Скопируем все из исходного файла в файл архива через упаковывающифй поток
      CompressStream.CopyFrom(SourceFileStream,bytecount);
    finally
      CompressStream.Free;
    end;
  finally
    SourceFileStream.free;
    DestFileStream.Free;
  end;
end;

procedure DeCompressFile(SourceFileName,DestFileName:string);
var
  SourceFileStream:TFileStream;
  DestFileStream:TFileStream;
  DeCompressStream:TDecompressionStream;
  bytecount : Integer;
begin
  //Архивируем измененный файл
  //поток исходного файла архива
  SourceFileStream:=TFileStream.Create(SourceFileName,fmOpenRead);
  //поток целевого файла
  DestFileStream:=TFileStream.Create(DestFileName,fmCreate);
  //размер исходного файла
  bytecount:=SourceFileStream.Size;
  try
    //прочитаем размер разархивируемого файла
    SourceFileStream.Read(bytecount,SizeOf(bytecount));
    //если размер больше нуля
    if bytecount > 0 then
    begin
      //Создадим разархивирующий поток от файла архива
      DeCompressStream := TDecompressionStream.Create(SourceFileStream);
      try
        //вытащим все из разархивирующего потока
        DeCompressStream.CopyFrom(DeCompressStream,bytecount);
      finally
        DeCompressStream.Free;
      end;
    end;

  finally
    SourceFileStream.free;
    DestFileStream.Free;
  end;
end;

Ссылки по теме:
http://k210.org/delphi/main/4/ - основной пример
http://forum.codecall.net/topic/76077-compress-and-decompress-with-zlib-library/ - пример без CopyFrom
http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=72368 - описание проблемы при переходе к версии Delphi с Unicode
http://stackoverflow.com/questions/943867/zlib-in-delphi-2009 - альтернативный пример
http://delphimaster.net/view/1-1111001345 - пример

4 комментария:

  1. Не скачиваются библиотеки с base2ti, ошибка 401. Какие-то хитрости есть или сбой у них?

    ОтветитьУдалить
    Ответы
    1. Да что-то у них проблемы. Написал на саппорт им, может что сделают. На гитхабе в чьем то репе есть исходники https://github.com/mike-lischke/GraphicEx/tree/master/3rd%20party/DelphiZlib

      Удалить