AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign d7zip / sevenzip.pas von mail2nnv - Fragen zur Funktionsweise, DictionarySize, ...

d7zip / sevenzip.pas von mail2nnv - Fragen zur Funktionsweise, DictionarySize, ...

Ein Thema von DieDolly · begonnen am 29. Apr 2023 · letzter Beitrag vom 9. Mai 2023
Antwort Antwort
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: d7zip / sevenzip.pas von mail2nnv - Fragen zur Funktionsweise, DictionarySize, ..

  Alt 29. Apr 2023, 21:08
Ps: DieDolly, les doch mal was da im sevenzip.pas steht, da wird dir doch per X gezeigt was erlaubt ist und was nicht.
Also das was du möchtest, SetDictionnarySize, ist nur für das Zip und BZip2 format (CLSID_CFormatZip, CLSID_CFormatBZ2) verfügbar.
Code:
                                                                                             //  ZIP 7z GZIP BZ2
  procedure SetCompressionLevel(Arch: I7zOutArchive; level: Cardinal);                       //   X  X  X  X
  procedure SetMultiThreading(Arch: I7zOutArchive; ThreadCount: Cardinal);                   //   X  X      X

  procedure SetCompressionMethod(Arch: I7zOutArchive; method: TZipCompressionMethod);        //   X
  procedure SetEncryptionMethod(Arch: I7zOutArchive; method: TZipEncryptionMethod);          //   X
  procedure SetDictionnarySize(Arch: I7zOutArchive; size: Cardinal); // < 32                 //   X          X
  procedure SetMemorySize(Arch: I7zOutArchive; size: Cardinal);                              //   X
  procedure SetDeflateNumPasses(Arch: I7zOutArchive; pass: Cardinal);                        //   X      X  X
  procedure SetNumFastBytes(Arch: I7zOutArchive; fb: Cardinal);                              //   X      X
  procedure SetNumMatchFinderCycles(Arch: I7zOutArchive; mc: Cardinal);                      //   X      X


  procedure SevenZipSetCompressionMethod(Arch: I7zOutArchive; method: T7zCompressionMethod); //       X
  procedure SevenZipSetBindInfo(Arch: I7zOutArchive; const bind: UnicodeString);             //       X
  procedure SevenZipSetSolidSettings(Arch: I7zOutArchive; solid: boolean);                   //       X
  procedure SevenZipRemoveSfxBlock(Arch: I7zOutArchive; remove: boolean);                    //       X
  procedure SevenZipAutoFilter(Arch: I7zOutArchive; auto: boolean);                          //       X
  procedure SevenZipCompressHeaders(Arch: I7zOutArchive; compress: boolean);                 //       X
  procedure SevenZipCompressHeadersFull(Arch: I7zOutArchive; compress: boolean);             //       X
  procedure SevenZipEncryptHeaders(Arch: I7zOutArchive; Encrypt: boolean);                   //       X
  procedure SevenZipVolumeMode(Arch: I7zOutArchive; Mode: boolean);                          //       X
Gruß vom KodeZwerg

Geändert von KodeZwerg (29. Apr 2023 um 21:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: d7zip / sevenzip.pas von mail2nnv - Fragen zur Funktionsweise, DictionarySize, ..

  Alt 30. Apr 2023, 09:24
Nach längerem testen habe ich festgestellt das die alte API inkompatibel zu den Bibliotheken ist.
Es wurde zwar kein Fehler gemeldet aber stur nur mit LZMA archiviert.
Im Anhang sind für x86 und x64 funktionierende Bibliotheken und Test-Anwendungen.
Merkwürdiger weise interessiert es der dll nicht welche Kompressionslevel ich angebe aber die Methoden funktionieren nun.
Die BZip2 Methode lässt bei mir die Applikation einfrieren, der Rest funktioniert.
Die Test-Anwendungen sind nun (abgesehen vom BZip2 und das ignorieren des Levels) stabil.
Die Datei Liste wurde überarbeitet und lässt keine doppelten Dateien mehr zu. (nur wenn sie aus verschiedenen Verzeichnissen abstammen)
Drag und Drop aus dem Explorer für Dateien oder Verzeichnisse wurde integriert.
In den Archiven wird nun der Pfad korrekt abgelegt, es wird aus allen Dateien der niedrigste gemeinsame Pfad ermittelt und im Archiv verwendet.
Passwort Verschlüsselung und Anzahl der Threads wurde hinzugefügt.
Angehängte Grafiken
Dateityp: png Bild_2023-04-30_102753784.png (16,6 KB, 25x aufgerufen)
Angehängte Dateien
Dateityp: zip 7zip.zip (2,60 MB, 22x aufgerufen)
Gruß vom KodeZwerg

Geändert von KodeZwerg (30. Apr 2023 um 09:28 Uhr)
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#3

AW: d7zip / sevenzip.pas von mail2nnv - Fragen zur Funktionsweise, DictionarySize, ..

  Alt 30. Apr 2023, 13:11
Danke für die Demo und das Testen.

Es muss doch eine andere Möglichkeit geben, um bzip2, deflate usw zum Laufen zu bekommen. Eine DLL von 2009 kann nicht die Lösung sein.
Die API setzt das Property 0 (Null) für die Kompressionsmethode. Vielleicht ist das veraltet bzw. die Namensgebung SevCompressionMethod: array[T7zCompressionMethod] of UnicodeString = ('COPY', 'LZMA', 'BZIP2', 'PPMD', 'DEFLATE', 'DEFLATE64');
Für das LZMA-Problem habe ich eine Lösung. In der SetMultithreading-Prozedur steht normalerweise
Delphi-Quellcode:
procedure SetMultiThreading(Arch: I7zOutArchive; ThreadCount: Cardinal);
begin
 SetCardinalProperty(arch, 'MT', ThreadCount);
end;
Das abgeändert zu dem hier und das LZMA-Problem ist weg
Delphi-Quellcode:
procedure SetMultiThreading(Arch: I7zOutArchive; ThreadCount: Cardinal);
begin
 // SetCardinalProperty(arch, 'MT', ThreadCount);

 if ThreadCount > 1 then
  SetCardinalProperty(arch, 'MT', ThreadCount)
 else if ThreadCount <= 0 then
  SetBooleanProperty(arch, 'MT', False);
end;
Das Problem liegt also bei 7z selbst.

Vielleicht hilft die Community ja mit, dass Delphi endlich eine sehr gut funktionierende 7z-DLL-API bekommt. Die von Jedi in allen Ehren, aber die ist nix.

Was mir auch aufgefallen ist:
- Kompressionslevel SAVE und Kompressionsmethode COPY funktionieren nur im Single-Threaded-Modus
-- funktionieren außerdem nur, wenn EncryptHeaders nicht an ist. Ist EncryptHeaders an, sind wir wieder beim LZMA-Problem.

Die hier vorgestellte API schreibt die 7z Kompressionsmethode ins Property 0 (Null). Ich weiß nicht wie aktuell diese Seite ist, aber hier ist die Rede vom Property N https://sevenzip.osdn.jp/chm/cmdline...d.htm#MethodID

Will man das machen kommt aber wieder nur, wie immer "Fehler bei Bereichsprüfung"

Geändert von DieDolly (30. Apr 2023 um 13:52 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: d7zip / sevenzip.pas von mail2nnv - Fragen zur Funktionsweise, DictionarySize, ..

  Alt 30. Apr 2023, 13:58
Danke für die Demo und das Testen.
Gerne!

Es muss doch eine andere Möglichkeit geben, um bzip2, deflate usw zum Laufen zu bekommen. Eine DLL von 2009 kann nicht die Lösung sein.
Naja, die Header sind von 2009, von daher bleibe ich nun auch beim testen bei diesen alten Bibliotheken.

Das Problem liegt also bei 7z selbst.
Oder die Header Übersetzung... Du siehst ja das nicht alles so klappt wie man eigentlich vermuten sollte.

- Kompressionslevel SAVE und Kompressionsmethode COPY funktionieren nur im Single-Threaded-Modus
-- funktionieren außerdem nur, wenn EncryptHeaders nicht an ist. Ist EncryptHeaders an, sind wir wieder beim LZMA-Problem.
Also die 7z.dll macht irgendwie schon das was sie sollte, nur eben nicht alles.
Abgesehen von BZip2, Kompressions Level und Threads, arbeitet es einwandfrei.
Das mit den Threads ist mir erstmal gar nicht so ins Auge gefallen da ich mich mehr auf die erzeugten Archive fokusiert hatte.

Deinen Patch kann ich nicht nachvollziehen.
Delphi-Quellcode:
procedure SetMultiThreading(Arch: I7zOutArchive; ThreadCount: Cardinal);
begin
// SetCardinalProperty(arch, 'MT', ThreadCount);
 if (ThreadCount > 1) then
   SetCardinalProperty(arch, 'MT', ThreadCount)
 else
   if (ThreadCount <= 0) then
     SetBooleanProperty(arch, 'MT', False);
end;
Macht doch das gleiche wie
Delphi-Quellcode:
procedure SetMultiThreading(Arch: I7zOutArchive; ThreadCount: Cardinal);
begin
  SetCardinalProperty(arch, 'MT', ThreadCount);
end;
(Boolean False wird doch zu einer 0)

So sieht meine "Pack" routine aus:
Delphi-Quellcode:
procedure TfrmMain.btnCreateClick(Sender: TObject);
var
  Arch: I7zOutArchive;
  fn: string;
  i: Integer;
  len: Integer;
begin
  if (lbFiles.Items.Count > 0) then
    if sdCreate.Execute(Self.Handle) then
      begin
        // update UI
        btnAdd.Enabled := False;
        btnClear.Enabled := False;
        edtPassword.Enabled := False;
        gbLevel.Enabled := False;
        rgMethod.Enabled := False;
        cbThreads.Enabled := False;
        cbThread.Enabled := False;
        Application.ProcessMessages;
        Sleep(1);
        // begin creating internal archive format
        Arch := CreateOutArchive(CLSID_CFormat7z);
        // store filename
        fn := sdCreate.FileName;
        // calculate the number of chars to be stripped
        if (lbFiles.Items.Count > 1) then
          len := Succ(Length(FindCommonPath(PathDelim, lbFiles.Items.ToStringArray)));
        // compression level 0-9 (store - ultra)
        SetCompressionLevel(Arch, tbLevel.Position);
        // compression method
        case rgMethod.ItemIndex of
          0: SevenZipSetCompressionMethod(Arch, m7Copy);
          1: SevenZipSetCompressionMethod(Arch, m7LZMA);
          2: SevenZipSetCompressionMethod(Arch, m7BZip2);
          3: SevenZipSetCompressionMethod(Arch, m7PPMd);
          4: SevenZipSetCompressionMethod(Arch, m7Deflate);
          5: SevenZipSetCompressionMethod(Arch, m7Deflate64);
          else
            SevenZipSetCompressionMethod(Arch, m7Copy);
        end;
        // number of threads
        if ((not cbThread.Checked) and (cbThreads.Items.Strings[0] <> 'N/A')) then
          SetMultiThreading(Arch, Succ(cbThreads.ItemIndex))
        else
          SetMultiThreading(Arch, 0);
        // optional try archive settings
        SevenZipRemoveSfxBlock(Arch, True);
        SevenZipSetSolidSettings(Arch, True);
        SevenZipAutoFilter(Arch, True);
        SevenZipCompressHeaders(Arch, True);
        SevenZipCompressHeadersFull(Arch, True);
        SevenZipEncryptHeaders(Arch, True);
        // optional password encrypt
        if (edtPassword.Text <> '') then
          Arch.SetPassword(edtPassword.Text);
        // use progressbar
        Arch.SetProgressCallback(Self, ProgressCallback);
        // add files to archive, stripping leading folders
        if (lbFiles.Items.Count = 1) then
          Arch.AddFile(lbFiles.Items.Strings[0], ExtractFileName(lbFiles.Items.Strings[0]))
        else
          for i := 0 to Pred(lbFiles.Items.Count) do
            Arch.AddFile(lbFiles.Items.Strings[i], Copy(lbFiles.Items.Strings[i], Succ(len), (Length(lbFiles.Items.Strings[i]) - len)));
        // encode and write the archive
        Arch.SaveToFile(fn);
        // update UI
        btnAdd.Enabled := True;
        btnClear.Enabled := True;
        edtPassword.Enabled := True;
        gbLevel.Enabled := True;
        cbThread.Enabled := True;
        cbThreads.Enabled := ((not cbThread.Checked) and (cbThreads.Items.Strings[0] <> 'N/A'));
        rgMethod.Enabled := True;
        Application.ProcessMessages;
      end;
end;
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#5

AW: d7zip / sevenzip.pas von mail2nnv - Fragen zur Funktionsweise, DictionarySize, ..

  Alt 30. Apr 2023, 14:02
Zitat:
Deinen Patch kann ich nicht nachvollziehen.
Macht doch das gleiche wie
Der Patch ist direkt von SourceForge. Wenn man MT auf 0 setzt, ist es nicht zwangsweise auf Off gesetzt. Das macht der Patch.

Ich würde mir sehr wünschen, dass es aktuelle Header gibt. Die von Jedi sind halt auch nicht gut. Mit den Jedis kann man nur bei Zip-Archiven die Kompressionsmethode wählen, bei 7z nicht.
Ich würde das ja erweitern, aber JclCompression ist eine einzige Katastrophe. Deswegen dachte ich an diese Bibliothek von https://github.com/mail2nnv/d7zip, welche letztes Jahr erst abgeändert wurde.

Für Delphi scheint es einfach nichts Brauchbares zu geben.

Tun wir uns doch zusammen, und bauen mal etwas, was heute funktioniert - eine funktionierende, von der DelphiPraxis ins Leben gerufene Delphi 7z-Bibliothek.

Geändert von DieDolly (30. Apr 2023 um 14:17 Uhr)
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#6

AW: d7zip / sevenzip.pas von mail2nnv - Fragen zur Funktionsweise, DictionarySize, ..

  Alt 30. Apr 2023, 16:23
Ich habe ChatGPT mal gefragt ob das Ding helfen kann, aber die Antworten sind zu 75% falsch. Es werden Units eingebunden, die nichts mit der mit Delphi mitgelieferten sevenzip.pas oder mit der hier vorgestellten Bibliothek zu tun haben.

Geändert von DieDolly (30. Apr 2023 um 16:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.698 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: d7zip / sevenzip.pas von mail2nnv - Fragen zur Funktionsweise, DictionarySize, ..

  Alt 30. Apr 2023, 16:39
Ich hatte gehofft, dass das einfach eine C API ist, aber anscheinend benutzt es Interfaces, die "irgendwie" initialisiert werden müssen (laut readme.txt im DOCS-Verzeichnis). Das ist mir auf die Schnelle zu komplex. d7zip macht das anscheinend auch.

Ich hätte nämlich definitiv Interesse an einer funtionierenden Import-Unit für die 7z.dll, da ich nach meinem Urlaub damit große Dateien ein- und auspacken wollte, und zwar idealerweise mit bzip2.
(Für ZIP funktionieren die jcl-Units problemlos, die verwenden wir schon seit Ewigkeiten.)
Thomas Mueller
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz