Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Lazarus (IDE) (https://www.delphipraxis.net/81-lazarus-ide/)
-   -   LZMA compiler in Lazarus? (https://www.delphipraxis.net/182524-lzma-compiler-lazarus.html)

Kratons 29. Okt 2014 19:40

LZMA compiler in Lazarus?
 
Hi liebe Community,

ich versuche momentan einen (De-)Komprmirung von der in meinem Programm verwendeten daten zu erreichen.

hierzu verwende ich die 'Pascal LZMA IDK' (eine dammlung von units welche vom ursprünglichen C++ Code her für Delphi Übersetht wurden)

Delphi: https://www.birtles.org.uk/programming/
Original C++: http://www.7-zip.org/sdk.html

Momentan hab ich es mit den beiligenden Beispielen und 'How to use' soweit geschaft das ich eine einzelde datei in die .7z datei bekomme. (ist dann komprimirt und alles)
Allerdings wird diese das in test umbenant und es ist halt nur eine datei.

Ich würde gerne ganze Ordnerstrukturen sammt inhalt comprimiren. (für die saves des programms, --> Übertragung zu anderen)


Code:
unit UnStorychoose;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ULZMABench,ULZMAEncoder,ULZMADecoder,UBufferedFS,ULZMACommon;

type

  { TfmStorychoose }

  TfmStorychoose = class(TForm)
    Button1: TButton;
    dlSpielwahl: TOpenDialog;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  fmStorychoose: TfmStorychoose;

implementation

{$R *.lfm}

{ TfmStorychoose }

procedure TfmStorychoose.Button1Click(Sender: TObject);
var
   encoder: TLZMAEncoder;
   inStream:TBufferedFS;
   outStream:TBufferedFS;
   filesize:int64;
   i: Integer;

begin
     inStream:=TBufferedFS.Create(dlSpielwahl.FileName,fmOpenRead or fmsharedenynone);
     outStream:=TBufferedFS.Create('C:\test.7z',fmcreate);

     encoder:=TLZMAEncoder.Create;
     encoder.SetEndMarkerMode(false);
     encoder.WriteCoderProperties(outStream);
     fileSize := inStream.Size;
        for i := 0 to 7 do
            WriteByte(outStream,(fileSize shr (8 * i)) and $FF);
     encoder.Code(inStream, outStream, -1, -1);
     encoder.free;
     outStream.Free;
     inStream.Free;
end;
end.
Würde mich über irgentwelche idean freuen wie ich das Umsetzen könnte.

PS: Ich weis das es gute .zip und .rar componeten für Lazarus giebt diese unterstützen aber leider nicht den LZMA algorytmus (.lzma bzw. .7z) welchen ich gerde aufgrund seiner extremst guten Kommprimirungsrate haben wollte.

cookie22 30. Okt 2014 07:27

AW: LZMA compiler in Lazarus?
 
Mit dem LZMA-Encoder kannst du halt nur einen Stream komprimieren. Das ist dann auch keine 7-Zip Datei (also die Endung .7z ist hier falsch), sondern eine LZMA komprimierte Datei. Da musst du dich schon selbst drum kümmern, was in den Stream kommt.

Wenn du ein integriertes Dateisystem willst musst du ein Archivformat wie 7-Zip oder Zip benutzen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz