Delphi-PRAXiS
Seite 3 von 6     123 45     Letzte »    

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)

Alter Mann 30. Apr 2023 22:08

AW: d7zip / sevenzip.pas von mail2nnv - Fragen zur Funktionsweise, DictionarySize, ..
 
Liste der Anhänge anzeigen (Anzahl: 4)
Hallo,

nur so am Rande: Von welcher 7Zip.dll reden wir (siehe Anhang)?

Ich habe folgende im Angebot:

https://github.com/mail2nnv/d7zip = m2n.png
https://github.com/geoffsmith82/d7zip = hg_x86, hg_x64
Unbekannt = Unbekannt
KodeZwerg = m2n (bezogen auf die Versions-Nr. 4.65.0.0

himitsu 30. Apr 2023 22:32

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

Zitat von DieDolly (Beitrag 1521848)
DLL in Exe als Resource kenne ich, aber was hat es mit Obj-Dateien aufsich? Sind Obj-Dateien leichter zu behandeln, braucht es dafür keinen komplizierten Wrapper mehr?

OBJ ist ein vorkompilierter Code (egal von welcher Programmiersprache), welcher direkt in unsere Kompilate integriert werden kann. (bissl vergleichbar mit unseren DCU)
Beispiele sind z.B. die Funktionen von MIDAS (MidasLib.pas), ZLib (System.ZLib.pas oder IdZLibHeaders.pas), RegEx (System.RegularExpressionsAPI.pas > System.RegularExpressions.pas), JPEG (Vcl.Imaging.jpeg.pas), PNG (nicht mehr) oder Delphi-Referenz durchsuchenDelayed-Loading (SysInit.pas).


Die DLL in den Resourcen mußt du erst draußen speichern, um sie zu laden, oder etwas böser in den RAM laden und manuell von dort laden. (und hoffen der Virenscanner hat nix dagegen)


Theoretisch kann man nahezu jeden C++-Code als OBJ kompileren und so ins Delphi pringen.
Ich bin noch am Experimentieren, GIT so ins Delphi zu bekommen, also um optimaler damit zu arbeiten. (Beispiel ist TortoiseGit, welches teilweise die GitLib integriert hat, aber auch teilweise direkt mit der GIT.exe redet ... z.B. Krank beim Revert jede Datei mit je zwei GIT.exe-Aufrufen extrem langsam und Anderes aber intern sehr schnell)

Zitat:

Zitat von Alter Mann (Beitrag 1521853)
nur so am Rande: Von welcher 7Zip.dll reden wir (siehe Anhang)?

Am Besten vom aktuellen Original?
https://7-zip.de/download.html

KodeZwerg 30. Apr 2023 22:33

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

Zitat von DieDolly (Beitrag 1521852)
Ich denke mit 7z ist das einfacher und der Code ist selbsterklärend-"er".

Die Aufrufe sind analog zur sevenzip.pas.
Zitat:

Zitat von mytbo (Beitrag 1521851)
Wenn es auch die mORMot Unit mormot.lib.win7zip sein darf

Auf jeden Fall (jedenfalls von meiner Seite her)
Ich habe es so versucht, jedoch ohne Erfolg beim umstellen des SetCompressionLevel, da ich daran schon scheitere habe ich die weiteren features nicht weiter angerührt.
Delphi-Quellcode:
procedure TfrmMain.btnCreateClick(Sender: TObject);
var
  zipFileName: TFileName;
  libWriter: I7zWriter;
begin
  zipFileName := MakePath([Executable.ProgramFilePath, 'TestDaten.7z']);
  if (cbFormat.ItemIndex <= 0) then
    cbFormat.ItemIndex := 7;
  libWriter := New7zWriter(T7zFormatHandler(cbFormat.ItemIndex), '7z.dll');
//  libWriter := New7zWriter(fh7z, '7z.dll');
  libWriter.SetCompressionLevel(cbLevel.ItemIndex);
//  libWriter.SetCompressionLevel(0); // von 0 bis 9 alle getestet, es kommt immer das gleiche raus
  libWriter.SetCompressionMethod(TZipCompressionMethod(cbMethod.ItemIndex));
//  libWriter.SetCompressionMethod(mzLzma);
  libWriter.AddFile('7z.dll', '7z.dll');
  libWriter.SaveToFile(zipFileName);
  libWriter := Nil;
end;
(die auskommentierten zeilen zeigen was sich hinter meinen Indexen verbirgt)
Aber sehr positiv zu erwähnen, BZip2 funktioniert.
Da ich in der mormot.lib.win7zip.pas Datei leider keine Informationen finde auf welcher Bibliothek-Version es basiert habe ich es mit der aktuellen 64bit 7z.dll (22.1.0.0) getestet.

Alter Mann 30. Apr 2023 22:54

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

Am Besten vom aktuellen Original?
Also die 22.01 von hg oder dem Original:).

Da hätten wir dann auch gleich die(?) Ausgangsbasis(hg).

mytbo 30. Apr 2023 23:38

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

Zitat von KodeZwerg (Beitrag 1521855)
Ich habe es so versucht, jedoch ohne Erfolg beim umstellen des SetCompressionLevel, da ich daran schon scheitere habe ich die weiteren features nicht weiter angerührt.

Ich habe es mit der 32-Bit Version 22.01 der 7za.dll getestet. Wenn die DLL im Programmverzeichnis liegt, gebe keinen Bibliothekspfad an, mORMot sucht sie. Laut dieser Beschreibung sind für den CompressionLevel die Werte 1/3/5/7/9 zulässig. Bei mir funktioniert es. Du darfst es nicht mit den synthetischen Random-Testdaten versuchen, damit ist ab einem gewissen Level jeder Algorithmus überfordert.
Delphi-Quellcode:
var
  zipFileName: TFileName;
  libReader: I7zReader;
  libWriter: I7zWriter;
  content: RawByteString;
begin
  content := StringFromFile(MakePath([Executable.ProgramFilePath, 'mormot.lib.openssl11.pas']));
  zipFileName := MakePath([Executable.ProgramFilePath, 'TestDaten.7z']);

  libWriter := New7zWriter(fh7z);
  libWriter.SetCompressionLevel(7); // x Parameter (1/3/5/7/9)
  libWriter.AddBuffer('Lib\mormot.lib.openssl11.pas', content);
  libWriter.SaveToFile(zipFileName);
  libWriter := Nil;

  libReader := New7zReader(zipFileName);
  var libData: RawByteString := libReader.Extract('Lib\mormot.lib.openssl11.pas');
  if (Length(content) = Length(libData))
    and CompareMem(Pointer(content), Pointer(libData), Length(content)) then
  begin
    ShowMessage('Ok!');
  end;
Benchmark-Werte:
LevelDateigrößeLaufzeit [ms]
Original340.019 
154.03511
353.74211
548.81135
747.95942
947.95942

Bis bald...
Thomas

KodeZwerg 1. Mai 2023 00:16

AW: d7zip / sevenzip.pas von mail2nnv - Fragen zur Funktionsweise, DictionarySize, ..
 
Thomas Dankeschön für Dein weiteres Beispiel samt Erklärung und den Link!
Delphi-Quellcode:
libWriter.SetCompressionMethod();
Das mag er nicht, habe es nun mit der 64bit 7za.dll v22.1.0.0 (ohne dll Angabe) erfolgreich getestet (Level 0 = copy, alles darüber ist LZMA2)
(Ich bin beim AddFile() geblieben)
Zitat:

Zitat von mytbo (Beitrag 1521857)
Du darfst es nicht mit den synthetischen Random-Testdaten versuchen, damit ist ab einem gewissen Level jeder Algorithmus überfordert.

Das habe ich nicht verstanden, aber hey, nun akzeptiert er meinen Input :-D

himitsu 1. Mai 2023 00:22

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

Zitat von mytbo (Beitrag 1521857)
Laut dieser Beschreibung sind für den CompressionLevel die Werte 1/3/5/7/9 zulässig. Bei mir funktioniert es.

Von 0 bis 9 ist alles möglich, aber die geraden Werte werden einfach abgerundet, da sie nicht implementiert sind.
Selbes gilt übrigens auch für ZIP.

LZ4 wäre hier eine nette Sache, aber eigentlich hätte ich es gern in einer zip-Datei, anstatt in einer 7z.
Und auch wenn man hier 7-Zip dafür verwenden könnte etwas im Buffer/RAM zu komprimieren.
Eine sauschnelle Komprimierung bietet viele Vorteile (auch wenn es nicht unbedingt extrem viel Platz einspart)

dummzeuch 1. Mai 2023 08:45

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

Zitat von Alter Mann (Beitrag 1521853)
Von welcher 7Zip.dll reden wir (siehe Anhang)?

Ich habe folgende im Angebot:

https://github.com/mail2nnv/d7zip = m2n.png
https://github.com/geoffsmith82/d7zip = hg_x86, hg_x64
Unbekannt = Unbekannt
KodeZwerg = m2n (bezogen auf die Versions-Nr. 4.65.0.0

Ich verwende immer die aus dem offiziellen Installer von https://www.7-zip.org . Für Delphi immer die 32 Bit dll, weil ich außer ein paar Tests keine 64 Bit Delphi Projekte habe.

dummzeuch 1. Mai 2023 08:48

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

Zitat von himitsu (Beitrag 1521854)
Die DLL in den Resourcen mußt du erst draußen speichern, um sie zu laden, oder etwas böser in den RAM laden und manuell von dort laden. (und hoffen der Virenscanner hat nix dagegen)

Es geht auch ohne, zumindest mit den meisten DLLs (7zip habe ich nicht probiert). Ich habe dafür eine Unit, die sich um Relocation und ermitteln der Entry-Points kümmert. Da wird nichts auf Platte gespeichert.

Allerdings warte ich jeden Tag darauf, dass die Virenscanner darauf allergisch reagieren.

dummzeuch 1. Mai 2023 08:52

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

Zitat von mytbo (Beitrag 1521851)
Zitat:

Zitat von dummzeuch (Beitrag 1521837)
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.

Wenn es auch die mORMot Unit mormot.lib.win7zip sein darf

Definitiv. Werde ich mir nach meiner Rückkehr ansehen. Danke für den Hinweis.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:43 Uhr.
Seite 3 von 6     123 45     Letzte »    

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