Delphi-PRAXiS
Seite 4 von 6   « Erste     234 56      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   d7zip / sevenzip.pas von mail2nnv - Fragen zur Funktionsweise, DictionarySize, ... (https://www.delphipraxis.net/212962-d7zip-sevenzip-pas-von-mail2nnv-fragen-zur-funktionsweise-dictionarysize.html)

DieDolly 1. Mai 2023 09:10

AW: d7zip / sevenzip.pas von mail2nnv - Fragen zur Funktionsweise, DictionarySize, ..
 
Wie verwendet man dieses mormot?

Geht das mit dem
Delphi-Quellcode:
StringFromFile(MakePath())
einfacher? Ich verstehe diese Zeile nicht so richtig. Ich habe das mit AddBuffer und Content einfach weggelassen und nehme stattdessen AddFile.
Fortschrittsanzeige, geht das auch mit mormot?^Weil das hier funktioniert nicht wie mit der sevenzip.pas
Delphi-Quellcode:
function ProgressCallback(Sender: I7zArchive; current, total: Int64): HRESULT;
begin
 if total >= BytesTotalToCopy then
  Form1.ProgressBar1.Max := 100
 else
  Form1.ProgressBar1.Position := ...;

 Result := S_OK;
end;

libWriter.SetProgressCallback(ProgressCallback); // Inkompatible Typen: 'Methodenzeiger und reguläre Prozedur'
Ich sehe gerade, was mormot aber auch nicht kann, warum auch immer: ein 7z Archiv erstellen mit Kompressionsstärke "Speichern", keine Kompressionsmethode, weil nicht notwendig bei nur "Speichern", EncryptHeaders und Passwort. Das Archiv wird trotzdem mit LZMA komprimiert.

Zitat:

Aber sehr positiv zu erwähnen, BZip2 funktioniert.
BZip2 funktioniert nur, wenn EncryptHeaders7z=False und kein Passwort gesetzt ist. Ansonsten gehts wieder zurück zu LZMA.
Egal was man macht, setzt man EncryptHeaders, setzt das den vom Nutzer gesetzten Wert von SetCompressionLevel zu LZMA zurück.

Keine der Bibliotheken scheint richtig zu funktionieren, egal wie alt. Liegt das Problem bei 7z selber?

KodeZwerg 1. Mai 2023 09:57

AW: d7zip / sevenzip.pas von mail2nnv - Fragen zur Funktionsweise, DictionarySize, ..
 
Bei meinen gestrigen tests, mit mORMot2, lasse unbedingt die zeile mit dem setzen einer methode weg @DieDolly, dann hast Du zugriff auf das Level, 0-9, wobei nur die von Thomas genannten werte dann dabei einen unterschied machen.
Es scheint, als ob das Level nur für LZMA2 funktioniert, sobald Du eine "custom-Methode" einbindest, wird das Level ignoriert.
Ich werde mir mal eine UI basteln in dem alles aufgeführt was möglich ist um es dann stück für stück zu testen, mit der Möglichkeit es auch abzuschalten.
Vielleicht ist ja auch für die API nichts vorgesehen um jede mögliche Einstellung die es gibt anzuwenden ...
Von meiner Seite her, ich bin mit der mORMot2 mehr zufrieden als mit der sevenzip.pas :thumb:

@dummzeuch, redest Du zufällig vom BTMemoryModule? Wenn nicht wäre ich echt begeistert Dein laden aus der Resource kennenzulernen :cyclops:

DieDolly 1. Mai 2023 10:10

AW: d7zip / sevenzip.pas von mail2nnv - Fragen zur Funktionsweise, DictionarySize, ..
 
So ganz verstehe ich deine Antwort nicht.
Ich halte mich da an die UI von 7z selber. Schaltet man das Level SPEICHERN (0) ein, kann man dort keine Kompressionsmethode wählen.
So gehe ich auch vor, also setze ich nur das Level, aber keine Methode. Aber selbst wenn man die manuell auf Copy setzt, gehts zurück zu LZMA (alles mit EncryptHeaders)

Es funktioniert also nicht. Beide Bibliotheken haben dieselbenm Probleme.

Nochmal zusammengefasst:
setzt man EncryptHeaders, kann man Level=SPEICHERN nicht nutzen, da es dann immer LZMA ist. Die 7z-UI kann das alles anders. Es funktioniert wunderbar, bis man ein Passwort und EncryptHeaders setzt :(

Ansonsten bin ich auch zufrieden. Die Aufrufe sind einfach und kurz. Nur das mit der 7z.dll ist komisch. Und für den ProgressCallback bin ich zu doof.

Das mit dem Callback habe ich so gemacht
Delphi-Quellcode:
type
 TProgressCallback = class
 public
  function OnProgress(const Sender: I7zArchive; current, total: Int64): HRESULT;
 end;

// Beim Aufruf
ProgressCallback := TProgressCallback.Create;
libWriter := New7zWriter(fh7z);
libWriter.SetProgressCallback(ProgressCallback.OnProgress);

mytbo 1. Mai 2023 13:53

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

Zitat von DieDolly (Beitrag 1521866)
Es funktioniert also nicht. Beide Bibliotheken haben dieselbenm Probleme.

Der Funktionsumfang der Bibliotheken 7z.dll, 7za.dll und 7zxa.dll unterscheidet sich erheblich. Auch die Möglichkeiten der einzelnen Kompressionsalgorithmen unterscheiden sich. Alles in allem eine große Anzahl an Kombinationen. Ein Blick in eine Beschreibung oder den Sourcecode erspart das Probieren. Die 7za.dll akzeptiert zum Beispiel für den CompressionLevel die Werte m7Copy, m7Lzma und m7Ppmd, aber nicht m7BZip2, m7Deflate und m7Deflate64. Die Exception Message "Falscher Parameter" weist darauf hin. Den ProgressCallback realisierst du wie folgt:
Delphi-Quellcode:
  ...
  private
    function ProgressCallback(const pmcSender: I7zArchive; pmCurrent, pmTotal: Int64): HRESULT;

function ...ProgressCallback(const pmcSender: I7zArchive; pmCurrent, pmTotal: Int64): HRESULT;
const
  STEP_WIDTH = 2;
var
  percentDone: Integer;
begin
  Result := S_OK;
  if pmCurrent = 0 then
  begin
    ProgressBar.Min := 0;
    ProgressBar.Max := 100;
    ProgressBar.Position := 0;
  end
  else if pmCurrent >= pmTotal then
    ProgressBar.Position := 0
  else
  begin
    percentDone := Trunc(pmCurrent / (pmTotal / 100));
    if (ProgressBar.Position + STEP_WIDTH) < percentDone then
      ProgressBar.Position := percentDone;
  end;
end;

var
  zipFileName: TFileName;
  libWriter: I7zWriter;
begin
  zipFileName := MakePath([Executable.ProgramFilePath, 'TestDaten.7z']);

  var timer: TPrecisionTimer;
  libWriter := New7zWriter(fh7z);
  libWriter.SetCompressionLevel(3);
  libWriter.SetProgressCallback(ProgressCallback);
  timer.Start;
  libWriter.AddFiles('c:\...\mORMot2\src\', '', '*', True);
  libWriter.SaveToFile(zipFileName);
  ShowMessage(timer.Stop);
Die Funktion
Delphi-Quellcode:
MakePath([Executable.ProgramFilePath, 'TestDaten.7z']);
macht das, was der Name sagt. Die mORMot Lösungen sind nur viel pragmatischer als die Delphi Bordmittel.

Bis bald...
Thomas

DieDolly 1. Mai 2023 14:06

AW: d7zip / sevenzip.pas von mail2nnv - Fragen zur Funktionsweise, DictionarySize, ..
 
Dass es da so einen großen Unterschied gibt, wusste ich nicht. Heißt das im Umkerhschluss, dass die 7z.dll alles drin hat?

mytbo 1. Mai 2023 14:14

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

Zitat von DieDolly (Beitrag 1521871)
Dass es da so einen großen Unterschied gibt, wusste ich nicht. Heißt das im Umkerhschluss, dass die 7z.dll alles drin hat?

Ja, wie dokumentiert. 7za.dll hat deutlich weniger und 7zxa.dll ist fast blank.

Bis bald...
Thomas

DieDolly 1. Mai 2023 14:34

AW: d7zip / sevenzip.pas von mail2nnv - Fragen zur Funktionsweise, DictionarySize, ..
 
Das Problem, wenn man EncryptHeaders aktiviert und der Komprimierungslevel automatisch von 0 auf 9 gesetzt wird und LZMA statt Copy, ist aber bestimmt trotzdem ein Fehler der DLL.

himitsu 1. Mai 2023 14:47

AW: d7zip / sevenzip.pas von mail2nnv - Fragen zur Funktionsweise, DictionarySize, ..
 
Und noch etwas zum ersten Post

Zitat:

Delphi-Quellcode:
function ProgressCallback(Sender: Pointer; Total: Boolean; Value: Int64): HRESULT; stdcall;
begin
 BytesCopied := Value; // Test

 if Total then
  Form1.ProgressBar1.Max := 100
 else
  Form1.ProgressBar1.Position := GetPercent(BytesToCopy, BytesCopied);

 Result := S_OK;
end;

Arch.SetProgressCallback(nil, ProgressCallback);

Rate mal, warum solche Funktionen fast immer sowas wie einen frei benutzbaren "Data"-Parameter besitzen?

Delphi-Quellcode:
function ProgressCallback(Sender: Pointer; Total: Boolean; Value: Int64): HRESULT; stdcall;
begin
 //if Total then
 //  TForm1(Sender).ProgressBar1.Max := 100
 //else
 //  TForm1(Sender).ProgressBar1.Position := GetPercent(BytesToCopy, Value);

 if Total then begin
   TForm1(Sender).FBytesToCopy := Value;
   TForm1(Sender).ProgressBar1.Max := 100;
 end else
   TForm1(Sender).ProgressBar1.Position := GetPercent(TForm1(Sender).FBytesToCopy, Value);

 Result := S_OK;
end;

Arch.SetProgressCallback(Pointer(Form1), ProgressCallback);

EdAdvokat 1. Mai 2023 17:57

AW: d7zip / sevenzip.pas von mail2nnv - Fragen zur Funktionsweise, DictionarySize, ..
 
Hallo zusammen,
eure Diskussion finde ich recht interessant, auch wenn ich selbst da nicht so der Fuchs bin.
Ich habe da mal so einiges zu 7zip recherchiert und bin da auf folgenden Beitrag aus der DP gestoßen.
Möglicherweise hilft der etwas weiter. Der Motzi hat im #17 ein Demoprogramm gepostet, das euch möglicherweise
weiter bringen könnte.

Wenn es völlig daneben sein sollte, bitte Entschuldigung.

https://www.delphipraxis.net/108543-...einbinden.html

Bei Torry.net habe ich auch noch was gefunden. Ist leider auch nicht ganz neu:

https://torry.net/quicksearchd.php?S...nzip&Title=Yes

DieDolly 1. Mai 2023 18:10

AW: d7zip / sevenzip.pas von mail2nnv - Fragen zur Funktionsweise, DictionarySize, ..
 
Kann man mit dem I7zWriter von mormot auch leere Verzeichnisse ins Archiv einbringen?

Ich verzweifle da gerade dran.

Delphi-Quellcode:
   libWriter.AddFile('1\1 2 3.txt', '1\1 2 3.txt');
   libWriter.AddFile('empty123', 'empty123');
   libWriter.SaveToFile(FileName);
Am Ende ist nur die Textdatei im Archiv.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:12 Uhr.
Seite 4 von 6   « Erste     234 56      

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