Einzelnen Beitrag anzeigen

Benutzerbild von KodeZwerg
KodeZwerg

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

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

  Alt 30. Apr 2023, 14: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