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, ...
Thema durchsuchen
Ansicht
Themen-Optionen

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
Seite 4 von 6   « Erste     234 56      
DieDolly

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

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

  Alt 1. Mai 2023, 10:10
Wie verwendet man dieses mormot?

Geht das mit dem 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?

Geändert von DieDolly ( 1. Mai 2023 um 11:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

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

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

  Alt 1. Mai 2023, 10:57
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

@dummzeuch, redest Du zufällig vom BTMemoryModule? Wenn nicht wäre ich echt begeistert Dein laden aus der Resource kennenzulernen
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
DieDolly

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

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

  Alt 1. Mai 2023, 11:10
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);

Geändert von DieDolly ( 1. Mai 2023 um 13:33 Uhr)
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
472 Beiträge
 
#34

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

  Alt 1. Mai 2023, 14:53
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 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
  Mit Zitat antworten Zitat
DieDolly

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

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

  Alt 1. Mai 2023, 15:06
Dass es da so einen großen Unterschied gibt, wusste ich nicht. Heißt das im Umkerhschluss, dass die 7z.dll alles drin hat?
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
472 Beiträge
 
#36

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

  Alt 1. Mai 2023, 15:14
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
  Mit Zitat antworten Zitat
DieDolly

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

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

  Alt 1. Mai 2023, 15:34
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#38

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

  Alt 1. Mai 2023, 15:47
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);
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 1. Mai 2023 um 15:49 Uhr)
  Mit Zitat antworten Zitat
EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
419 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#39

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

  Alt 1. Mai 2023, 18:57
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
Norbert
  Mit Zitat antworten Zitat
DieDolly

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

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

  Alt 1. Mai 2023, 19:10
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 6   « Erste     234 56      


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 12:29 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