AW: d7zip / sevenzip.pas von mail2nnv - Fragen zur Funktionsweise, DictionarySize, ..
Wie verwendet man dieses mormot?
Geht das mit dem
Delphi-Quellcode:
einfacher? Ich verstehe diese Zeile nicht so richtig. Ich habe das mit AddBuffer und Content einfach weggelassen und nehme stattdessen AddFile.
StringFromFile(MakePath())
Fortschrittsanzeige, geht das auch mit mormot?^Weil das hier funktioniert nicht wie mit der sevenzip.pas
Delphi-Quellcode:
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.
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' Zitat:
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? |
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: |
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); |
AW: d7zip / sevenzip.pas von mail2nnv - Fragen zur Funktionsweise, DictionarySize, ..
Zitat:
Delphi-Quellcode:
Die Funktion
...
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);
Delphi-Quellcode:
macht das, was der Name sagt. Die mORMot Lösungen sind nur viel pragmatischer als die Delphi Bordmittel.
MakePath([Executable.ProgramFilePath, 'TestDaten.7z']);
Bis bald... Thomas |
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?
|
AW: d7zip / sevenzip.pas von mail2nnv - Fragen zur Funktionsweise, DictionarySize, ..
Zitat:
Bis bald... Thomas |
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.
|
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 //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); |
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 |
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:
Am Ende ist nur die Textdatei im Archiv.
libWriter.AddFile('1\1 2 3.txt', '1\1 2 3.txt');
libWriter.AddFile('empty123', 'empty123'); libWriter.SaveToFile(FileName); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:12 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